Когда у меня есть числовой тип, который определяет operator<
для двойного, но не для int, сравнение с литералами int не работает. Это проблема, как части стандартной библиотеки, т.е. std::complex
содержат литералы int.
Можно ли заставить компилятор обрабатывать литералы int как двойные при использовании типа?
Упрощенный пример:
// the defined operator
template<typename T>
bool operator<(const Type<T> &lhs, const T &rhs);
complex<Type<T>> complex_number;
1.0 / complex_number; // this fails
Ошибка происходит внутри _Div
метод std::complex
в
template<class _Other> inline
void _Div(const complex<_Other>& _Right)
// ...
else if ((_Rightimag < 0 ? -_Rightimag : +_Rightimag)
что вызывает ошибку:
error C2678: binary '<': no operator found which takes a left-hand operand of type 'Type<T>' (or there is no acceptable conversion)
(...)
complex(665): note: while trying to match the argument list '(Type<T>, int)'
[
T=double
]
Я думаю, что, вероятно, код в std::complex
должно быть _Rightimag < static_cast<_Other>(0)
работать со всеми числовыми типами, но я должен работать с тем, что обеспечивает stdlib.
Поскольку другой тип также из библиотеки, я ищу способ добавить неявное преобразование в мой код.
Для фактического кода: я использую Церера, который позволяет вам определять функторы с шаблонным скалярным типом для автодифференцировки. Скаляр оценивается как T
и в качестве Jet<T, N>
,
Церера определяет operator<(const Jet<T, N>&, const T&)
, что позволяет jet < 0.0
но не для jet < 0
,
В моем коде я могу обойти эту проблему, используя удвоения или явное приведение целых чисел к типу шаблона T
, но когда я пытаюсь работать с complex<T>
У меня возникают проблемы с методами, которые сравниваются с целочисленными литералами, такими как _Div
метод выше.
std::complex
Шаблон не обязателен для работы с общими типами. Стандарт гласит [комплексное число] / 2:
Эффект создания шаблона
complex
для любого типа, кромеfloat
,double
, или жеlong double
не указано
Если вам нужно обобщить любой другой числовой тип на сложный тип, вы должны использовать какую-то другую библиотеку или реализовать свою собственную.
Да, вы можете получить неявное преобразование, определив конструктор, который принимает один параметр (типа, из которого вы преобразуете).