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

Any*_*orn 44 c++ templates

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

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

struct U {
    U() : t<void>() {} //does not work
    T t;
};
Run Code Online (Sandbox Code Playgroud)

谢谢

Joh*_*itb 45

这是不可能的.标准也有关于此的说明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;
};
Run Code Online (Sandbox Code Playgroud)

鉴于identity它是在boost中定义的

template<typename T> struct identity { typedef T type; };
Run Code Online (Sandbox Code Playgroud)

  • @litb:你知道他们是否有任何理由不让你明确地调用T :: T <foo>()? (15认同)