Когда у меня есть числовой тип, который определяет operator<
для double, но не для 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.
Поскольку другой тип также из библиотеки, я ищу способ добавить неявное преобразование в мой код.
Для реального кода: я использую ceres , который позволяет вам определять функторы с шаблонным скалярным типом для авто-дифференцирования. Скаляр оценивается как T
и Jet<T, N>
.
Ceres определяет operator<(const Jet<T, N>&, const T&)
, что позволяет jet < 0.0
, но не jet < 0
.
В моем коде я могу обойти эту проблему, используя двойные числа или явное приведение целых чисел к типу шаблона T
, но когда я пытаюсь работать с complex<T>
, у меня возникают проблемы с методами, которые сравниваются с целочисленными литералами, как метод _Div
выше.