C ++调用显式模板构造函数

时间:2010-05-07 07:33:19

标签: c++ templates

您能告诉我如何显式调用模板构造函数(在初始化列表中)吗? 例如:

struct T { 
    template<class> T();
};

struct U {
    U() : t<void>() {} //does not work
    T t;
};

感谢

1 个答案:

答案 0 :(得分:44)

这是不可能的。标准也在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喜欢它在boost

中的定义
template<typename T> struct identity { typedef T type; };