我有一个类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被转换为指针?
答案 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>*