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

时间:2012-04-02 21:03:12

标签: c++ templates copy-constructor

我有一个带有模板构造函数的类,代码实际上是在默认构造函数之后调用 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
{
};

1 个答案:

答案 0 :(得分:1)

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