当我有一个数字类型时,它定义operator<
为 double 但不是 int,与 int 文字的比较不起作用。这是一个问题,作为标准库的一部分,即std::complex
包含 int 文字。
使用该类型时,我可以让编译器将 int 文字视为 double 吗?
简化示例:
// 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
失败发生在at_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
上面的方法。