有时它有时不起作用:
template <class T>
void f(T t) {}
template <class T>
class MyClass {
public:
MyClass(T t) {}
};
void test () {
f<int>(5);
MyClass<int> mc(5);
f(5);
MyClass mc(5); // this doesn't work
}
Run Code Online (Sandbox Code Playgroud)
有没有办法破解上面的例子?即强制编译器从构造函数参数推断模板参数.
这将在未来修复,还是有充分理由不这样做?
编译器可以推断出模板参数的一般规则是什么?
jal*_*alf 56
当可以从模板参数推导出参数类型时,可以推断出函数模板的模板参数
所以可以在这里推断:
template <typename T>
void f(T t);
template <typename T>
void f(std::vector<T> v);
Run Code Online (Sandbox Code Playgroud)
但不是这里:
template <typename T>
T f() {
return T();
}
Run Code Online (Sandbox Code Playgroud)
而不是在课堂模板中.
因此,您的问题的通常解决方案是创建一个包装函数,类似于标准库函数std::make_pair:
template <class T>
class MyClass {
public:
MyClass(T t) {}
void print(){
std::cout<<"try MyClass"<<std::endl;
}
};
template <typename T>
MyClass<T> MakeMyClass(T t) { return MyClass<T>(t); }
Run Code Online (Sandbox Code Playgroud)
然后调用auto a = MakeMyClass(5);实例化该类.