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

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

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

谢谢

最佳答案

这是不可能的。标准在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; };

08-25 07:43
查看更多