调用正确的构造函数

时间:2014-04-08 21:25:20

标签: c++ templates constructor

我有一个类X,其中两个构造函数定义如下:

template <typename T>
class X {
  template <typename U>      
  X(U& u) {
   // some logic
  }

  X(const Y<T>& y) {
    // some other logic
  }
};

Y类有一个静态方法,它返回Y类型的对象。

template <typename T>
class Y {
  static Y<T> myStaticMethod(const T& t) {
    // some logic
  }
};

现在,如果我尝试,请使用以下代码:

const Y<double>& obj = Y<double>::myStaticMethod(1.0);
X<double> xObj = new X<double>(obj);

带有双模板T和U的构造函数被调用,T = double,这是预期的,但是U = Y<double>*,这是相当意想不到的。

我想要调用X的第二个构造函数,但它不会发生。而且,当我用引用调用构造函数时,为什么obj被转换为指针?

2 个答案:

答案 0 :(得分:2)

考虑你的行:

X<double> xObj = new X<double>(obj);

这告诉编译器获取新表达式的结果,并且 将它们转换为X<double>。新结果的类型 表达式为X<double>*; X<double>的唯一构造函数 可以使用指针template <typename T> X:X(U& )调用。 除了它也不能被调用,因为它需要绑定一个 rvalue到非const引用。但有些编译器坏了,而且 无论如何允许它。

如上所述,代码不应该编译,但如果是,则应该调用X<double>的构造函数两次。

答案 1 :(得分:1)

将该线分开并将它们分成两行。

X<double>* xObjPtr = new X<double>(obj);
X<double> xObj = xObjPtr;

现在为什么编译器试图调用它是有意义的:

template <typename U> X(U& u) {}

U == X<double>*