我有一个类 MyType
的类,实现了用户定义的算术类型。该类提供了以下转换运算符
struct MyType
{ ...
operator double()
{
return to_double(); // This converts my type to a double value
}
... };
按照下面的方式使用这个类就可以了。
double d = MyType(1);
但是,在std::complex中使用这个类作为类型,例如
#include <complex>
std::complex<double> c = std::complex<MyType>(1,1);
失败,出现以下编译器错误。
error: conversion from 'std::complex<MyType>' to non-scalar type 'std::complex<double>' requested
如果能帮助解决这个问题,我将不胜感激。
马蒂亚斯
特殊化
std::complex<float>
,std::complex<double>
和std::complex<long double>
是用于表示和操作复数的LiteralTypes。对任何其他类型的复数实例化模板的效果是不明确的。
所以 std::complex<MyType>
是 "有问题 "的...
忽略这部分。
而 std::complex<T>
有通用的转换构造函数,特殊化 std::complex<double>
只提供其他浮动复杂版本的转换。
但是 operator=
允许所有版本的通用转换(只有Msvc接受 编码 不过)。)
你必须提供你自己的(显式命名)转换函数。
std::complex<double> to_complex_double(std::complex<MyType>& c)
{
#if 0
std::complex<double> res;
res = c; // gcc/clang doesn't accept that.
return res;
#else
return {c.real(), c.imag()};
#endif
}
这个(不是特别优雅的)变通方法有帮助吗?
std::complex<MyType> dummy(1,1);
std::complex<double> c1(
static_cast<double>(dummy.real()), static_cast<double>(dummy.imag()));
我试过了各种不同的构造函数以及 std::complex
但没有找到更 "隐性 "的转换方式。
我想这是有关系的。为什么转换函数不能用于std: string?