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