我想要一个带有模板化转换运算符和默认构造函数的模板化类,但我的初始尝试不起作用。
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()。
在我看来,当我想要调用默认构造函数时,转换运算符被调用 - 它实际上是在尝试转换自身。但当然,有办法做我想做的事情吗?
答案 0 :(得分:1)
请注意,在operator X
(其中X
是一个类型)函数中,您通常应返回X
类型的内容。当您尝试将调用对象转换为导致以下情况发生的C<U>
时,您将返回U
:
int a = someC;
(其中someC
是任何类型的C
)会尝试将C<X>
分配给int
operator T<int>
上调用someC
,该C<int>
将返回int
,然后尝试将其分配给operator T<int>
C<int>
将在上述返回值上调用,该返回值将返回C<int>
int
的返回值将尝试转换为operator T<int>
,该goto 3;
将调用C<U>
.... operator T<U>
希望您能看到无限递归和后续堆栈溢出的原因。
您无法从C
班{{1}}返回{{1}}。如果您出于某种原因需要重新设计课程。