我有以下代码片段,其中我将通用(POD)类型包装到(模板)类中,并定义内部模板转换运算符,以便我能够在兼容之间进行隐式转换(但不同的类型。我希望代码是不言自明的。在任何情况下我都无法弄清楚为什么将Foo<double>
转换为另一个POD可以正常工作,但转换为std::complex<double>
(此处为cplx
的类型定义)可能会失败
error: call of overloaded 'complex(Foo<double>&)' is ambiguous
cplx z = (cplx)a;
有什么想法吗?代码如下:
#include <iostream>
#include <complex>
using cplx = std::complex<double>;
template <typename T>
class Foo // wrapper class for a POD
{
T val_; // this is the wrapped value
public:
Foo(T val = {}): val_(val) {};
template<typename S> // conversion operator
operator S ()
{
std::cout << "Calling conversion operator" << std::endl;
return val_;
}
// stream operator
friend std::ostream &operator<<(std::ostream &os, const Foo &rhs)
{
return os << rhs.val_;
}
};
int main()
{
Foo<double> a = 10.1;
// OK, calling the conversion operator double -> int
int i = 2 + (int)a;
// Calling conversion operator double -> cplx
// this line DOES NOT compile, why?!
// cplx z = (cplx)a;
}
答案 0 :(得分:2)
double
有float
,long double
和std::complex
个构造函数。编译器不知道使用哪个;它可以用任何一个实例化Foo::operator S
。
如果您选择其中一个,编译器可以填写其余部分:
cplx z = (cplx)(double)a;