转换运算符到std :: complex <double> </double>

时间:2014-08-03 00:58:06

标签: c++ templates c++11 type-conversion

我有以下代码片段,其中我将通用(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; 
}

1 个答案:

答案 0 :(得分:2)

doublefloatlong doublestd::complex个构造函数。编译器不知道使用哪个;它可以用任何一个实例化Foo::operator S

如果您选择其中一个,编译器可以填写其余部分:

cplx z = (cplx)(double)a;