1

可能重复:
使用没有模板参数的模板类

如果我有一个模板函数,我不需要实例化它,因为它可以从参数中推断出来,如下所示:

template<typename T> void MyFunc(T arg);

int x;    
MyFunc(x);

对于编译器可以猜测模板参数的任何情况,这都是真的吗?具体来说,我在想这个:

template<typename T>
class MyClass {
public:
  MyClass(T) { }
};

int x;
MyClass<int> c1(x); // regular style
MyClass c2(x); // is this allowed?
4

3 回答 3

4

是和不是。

编译器不会推断类模板参数的类型,但允许使用默认值,因此如果您int对该模板使用了很多,您可以这样做:

template <typename T=int>
class MyClass {
public:
    MyClass(T) {}
};

int x;
MyClass<> c2(x);

请注意,这仅适用于每个模板的一种特定类型。它不是根据您提供的参数类型来选择类型,只是使用您为模板指定的默认值,如果您没有指定类型但传递(比如说) a double,上面的模板仍然会实例化 over int,而不是double.

由于编译器可以/将推导出函数模板的模板参数,因此您还可以创建一个小模板函数并使用auto

template <class T>
MyClass<T> make_MyClass(T const &v) {
   return MyClass<T>(v);
}

int x;

auto c2 = make_MyClass(x);
于 2012-12-12T20:53:03.483 回答
3

不,这是不允许的,因为编译器只能在模板函数调用期间推断类型。

也就是说,常见的解决方案是辅助函数。

template<typename T>
class MyClass {
public:
  MyClass(T) { }
};

template<typename T>
MyClass<T> makeMyClass(T x)
{
  return MyClass<T>(x);
}
于 2012-12-12T20:50:12.587 回答
2

不,这是不允许的;模板参数扣除仅适用于模板函数,模板类不会从给构造函数的参数中扣除模板参数。

于 2012-12-12T20:48:00.050 回答