具有默认构造函数的模板类中的模板转换运算符?

时间:2011-12-02 01:42:40

标签: c++ templates casting constructor

我想要一个带有模板化转换运算符和默认构造函数的模板化类,但我的初始尝试不起作用。

template<typename T>
class C
{
public:
    C() {}

    template<typename U>
    operator U() 
    {
        C<U> c; // (*)
        c._a = dynamic_cast<U*>(_a); 
        return c;
    }
private:
    T* _a;
};

但是现在,当我尝试创建C的实例时,

template<typename T>
void F()
{
    ...
    C<T> obj;
}

运算符U()在(*)处反复调用自身,最终进行segfaulting。当我定义外部执行转换的函数并从运算符U()调用它时会发生同样的事情 - 在这种情况下,没有从类定义中调用C :: C()。

在我看来,当我想要调用默认构造函数时,转换运算符被调用 - 它实际上是在尝试转换自身。但当然,有办法做我想做的事情吗?

1 个答案:

答案 0 :(得分:1)

请注意,在operator X(其中X是一个类型)函数中,您通常应返回X类型的内容。当您尝试将调用对象转换为导致以下情况发生的C<U>时,您将返回U

  1. int a = someC;(其中someC是任何类型的C)会尝试将C<X>分配给int
  2. 将在operator T<int>上调用
  3. someC,该C<int>将返回int,然后尝试将其分配给operator T<int>
  4. C<int>将在上述返回值上调用,该返回值将返回C<int>
  5. int的返回值将尝试转换为operator T<int>,该goto 3;将调用C<U> ....
  6. operator T<U>
  7. 希望您能看到无限递归和后续堆栈溢出的原因。

    您无法从C班{{1}}返回{{1}}。如果您出于某种原因需要重新设计课程。