繁体   English   中英

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

[英]C++ Template constructor, why is copy constructor being called?

我有一个带有模板构造函数的类,并且代码实际上是在default-constructor之后调用副本构造函数,这对我来说没有意义,因为类型不正确。

例如:

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模板不会被实例化,因为已经有一个非常合适的调用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM