我有一个带有模板构造函数的类,代码实际上是在默认构造函数之后调用 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
};
此模板构造函数 正常工作 (在其他情况下已正确调用),但未正确识别为&#34;正确&#34;另一个模板函数的构造函数:
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
{
};
答案 0 :(得分:1)
您没有提供B
的定义,因此我假设A
是B
的祖先,B
可以隐式转换为{{}} {1}}。在这种情况下,A
的模板没有被实例化,因为已经有一个非常合适的调用。