template<typename T>
struct A
{
template<typename U>
A() {}
template<typename U>
static void f() {}
};
int main()
{
A<int>::f<int>(); // ok
auto a = A<int><double>(); // error C2062: type 'double' unexpected
}
这个问题在代码中是不言而喻的。
我的问题是:
如何调用模板类的模板ctor?
答案 0 :(得分:5)
您不能直接调用类的构造函数。如果你不能从调用中推断出构造函数的模板参数,那么就不可能调用那个特定的构造函数。
你可以做的是创建一些类型的包装器,可用于零开销扣除:
template <typename T>
struct type_wrapper { };
template<typename T>
struct A
{
template<typename U>
A(type_wrapper<U>) {}
};
int main()
{
auto a = A<int>(type_wrapper<double>{});
}
答案 1 :(得分:3)
如何调用模板类的模板ctor?
不幸的是,这是不可能的;您无法为构造函数模板显式指定模板参数。
§17.5.2/5 Member templates [temp.mem]
(强调我的)
[注意:因为显式模板参数列表遵循 函数模板名称,因为转换成员函数 不带调用模板和构造函数成员函数模板 使用函数名称,无法提供显式模板 这些功能模板的参数列表。 - 结束注释]