您能告诉我如何显式调用模板构造函数(在初始化列表中)吗?例如:struct T { template<class> T();};struct U { U() : t<void>() {} //does not work T t;};谢谢
1 回答
鸿蒙传说
TA贡献1865条经验 获得超7个赞
这是不可能的。该标准对此也有注释14.8.1/7
[注意:因为显式模板参数列表紧随功能模板名称,并且由于在不使用函数名称的情况下调用转换成员函数模板和构造函数成员函数模板,所以无法为这些功能模板提供显式模板参数列表。]
说明:这说:模板参数在函数模板名称(例如)之后的尖括号中传递std::make_pair<int, bool>。构造函数没有自己的名称,但是会在各种上下文中滥用其类名称(因此,U<int>()意味着:传递<int>给类模板U,并通过调用不带参数的默认构造函数来构造对象)。因此,不能将模板参数传递给构造函数。
在您的情况下,您尝试在成员初始化程序中传递模板参数。在这种情况下,还有更多的问题:它将尝试将其解析和解释t<void>为基类类型,并认为您想调用基类的默认构造函数。当然,这将失败。
如果可以忍受,可以解决它
struct T {
template<class U> T(identity<U>);
};
struct U {
U() : t(identity<void>()) {}
T t;
};
由于identity喜欢它的升压转换器的定义
template<typename T> struct identity { typedef T type; };
- 1 回答
- 0 关注
- 550 浏览
添加回答
举报
0/150
提交
取消