3

当我有一个数字类型时,它定义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,它允许您使用模板化标量类型定义函子以进行自微分。标量被评估为TJet<T, N>

Ceres定义了 operator<(const Jet<T, N>&, const T&),它允许jet < 0.0但不允许jet < 0

在我的代码中,我可以通过使用双精度数或将整数显式转换为模板类型来解决这个问题T,但是当我尝试使用与complex<T>整数文字比较的方法时,我遇到了麻烦,比如_Div上面的方法。

4

2 回答 2

5

std::complex模板不需要使用常规类型。标准说 [complex.numbers]/2:

为除、或 或complex以外的任何类型实例化模板的效果是未指定的。floatdoublelong double

如果您需要将任何其他类似数字的类型概括为类似复杂的类型,您应该使用一些不同的库或实现自己的库。

于 2018-09-10T14:49:43.020 回答
0

是的,您可以通过定义一个采用单个参数(您要转换的类型)的构造函数来获得隐式转换。

于 2018-09-10T14:45:19.173 回答