C++11 当模板参数是类模板时,如何专门化函数模板?

C++11 当模板参数是类模板时,如何专门化函数模板?,c++11,template-specialization,function-templates,C++11,Template Specialization,Function Templates,比如说 template<class T> T make() { return T(); } 当T是一个类模板a时,我想专门化它 template<int N> class A {}; template<int N> A<N> make<A<N>>() { ... }; 编译错误:非法使用显式模板参数 怎么做?您试图做的是部分专门化,是不允许的。最好将其包装在结构中 这不是部分专门化,而是过载。只需删除:

比如说

template<class T>
T make()
{
   return T();
}
当T是一个类模板a时,我想专门化它

template<int N>
class A
{};

template<int N>
A<N> make<A<N>>()
{
   ...
};
编译错误:非法使用显式模板参数


怎么做?

您试图做的是部分专门化,是不允许的。最好将其包装在结构中


这不是部分专门化,而是过载。只需删除:


这是部分专业化。您创建了一个新方法make,该方法返回的不是int。@user1899020在第一个重载中使用的是make类型。这里你想要一个整型的。部分专门化将简化为更专门化的类型,例如整型。
template<class T>
struct Maker
{
   T make() { return T(); }
};

template<int N>
class A
{};

template<int N>
struct Maker<A<N>>
{
   A<N> make()
   {
      return A<N>();
   }
};
template<int N>
A<N> make()
{
   ...
};