gpt4 book ai didi

C++模板构造函数,为什么要调用复制构造函数?

转载 作者:太空宇宙 更新时间:2023-11-04 12:10:42 25 4
gpt4 key购买 nike

我有一个带有模板构造函数的类,代码实际上是在默认构造函数之后调用 copy 构造函数,这对我来说没有意义,因为类型不正确。

例如:

class A
{
public:
A(void); // default constructor
A(const A& other); // copy constructor
template<class TYPE>
A(const TYPE& object_to_ref); // template constructor
};

此模板构造函数有效(在其他情况下被正确调用),但未被正确识别为来自另一个模板函数的“正确”构造函数:

template<class TYPE>
A& CreateA(const TYPE& object_to_ref)
{
// THIS FUNCTION IS NEVER SPECIALIZED WITH "A", ONLY WITH "B" !!
return *new A(object_to_ref); // CALLS "A::A(const A&)" !!??
}

失败示例:

B my_b;
A& my_a = CreateA(my_b); // "A::A(const A&)" called, not "A::A(const B&)"!

这对我来说没有意义。类型与复制构造函数不匹配。发生了什么? (MSVC2008)

我的解决方法是在这种情况下不使用模板构造函数:

template<class TYPE>
A& CreateA(const TYPE& object_to_ref)
{
A* new_a = new A(); //DEFAULT CONSTRUCTOR
new_a->setObjectToRef(object_to_ref); //OTHER TEMPLATE MEMBER FUNCTION
return *new_a;
}

问题:为什么在这种情况下没有调用模板构造函数?

(变通办法似乎运行正常,您是否建议替代方案?)

编辑 B 不相关,B 和/或A 之间没有指定转换:

class B
{
};

最佳答案

您没有提供 B 的定义,所以我继续假设 AB 的祖先并且 B 可以隐式转换为 A。在这种情况下,您的 B 模板没有被实例化,因为已经有一个非常合适的调用。

关于C++模板构造函数,为什么要调用复制构造函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9983796/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com