具有默认构造函数的模板类中的模板化转换运算符
Templated conversion operator in a template class with default 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(( 在 (*( 处一遍又一遍地调用自己,最终出现段错误。 当我定义在外部执行强制转换的函数并从运算符 U(( 调用它时也会发生同样的事情——在这种情况下,不会从类定义中调用 C::C((。
在我看来,当我想调用默认构造函数时,转换运算符被调用 - 它本质上是在尝试转换自己。 但可以肯定的是,有一种方法可以做我想做的事情吗?
请注意,在operator X
(其中X
是一种类型(函数中,通常应该返回类型 X
的内容。当您尝试将调用对象转换为U
时,您将返回一个C<U>
,这会导致发生以下情况:
-
int a = someC;
(其中someC
是任何类型的C
(将尝试将C<X>
分配给int
-
operator T<int>
将在返回C<int>
的someC
上调用,然后尝试将其分配给int
-
operator T<int>
将在上述返回值上调用,该值将返回一个C<int>
- 作为
C<int>
的返回值将尝试int
转换为将调用operator T<int>
.... -
goto 3;
希望你能明白为什么会发生无限递归和随后的堆栈溢出。
不能从类 C
的operator T<U>
返回C<U>
。如果出于某种原因需要,您需要重新设计您的类。
相关文章:
- 有没有一种方法可以通过"typedef"为重新定义的基本类型定义特征和强制转换运算符
- 构造函数和转换运算符之间的重载解析
- 分配给转换运算符失败-C++
- 转换运算符不适用于sleep_until
- 继承模板化转换运算符
- 模板转换运算符在 clang 6 和 clang 7 之间的区别
- 如何在模板化转换运算符中消除此构造的歧义?
- 为什么选择转换运算符的重载?
- 如何避免强制转换运算符 () 和访问运算符 [] 冲突?
- 如果可能的话,C++总是更喜欢右值引用转换运算符而不是常量左值引用吗?
- 了解转换运算符的选择C++
- 多个隐式转换运算符
- 这个typedef和转换运算符语法是什么意思
- 为什么转换运算符调用复制构造函数两次,而等效函数只调用它一次
- 类模板忽略了用户定义的转换运算符(非模板不忽略)
- 为什么在std::for_each()返回时调用转换运算符
- 为什么 std::optional 的强制转换运算符被忽略了
- 使用用户定义的转换运算符推导函数模板参数
- 模板转换运算符的分辨率不明确
- 统一初始化是隐式发生的,即使 int 强制转换运算符是使用 explicit 关键字声明的.原因是什么?