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

Templated conversion operator in a template class with default constructor?

本文关键字:转换 运算符 默认 构造函数      更新时间:2023-10-16

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

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(( 在 (*( 处一遍又一遍地调用自己,最终出现段错误。 当我定义在外部执行强制转换的函数并从运算符 U(( 调用它时也会发生同样的事情——在这种情况下,不会从类定义中调用 C::C((。

在我看来,当我想调用默认构造函数时,转换运算符被调用 - 它本质上是在尝试转换自己。 但可以肯定的是,有一种方法可以做我想做的事情吗?

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

  1. int a = someC;(其中someC是任何类型的C(将尝试将C<X>分配给int
  2. operator T<int>将在返回C<int>someC上调用,然后尝试将其分配给int
  3. operator T<int>将在上述返回值上调用,该值将返回一个C<int>
  4. 作为C<int>的返回值将尝试int转换为将调用operator T<int> ....
  5. goto 3;

希望你能明白为什么会发生无限递归和随后的堆栈溢出。

不能从类 Coperator T<U>返回C<U>。如果出于某种原因需要,您需要重新设计您的类。