在这篇文章中回答How to specialize a template for 2 different values?我想实现类定义之外的函数,但我似乎无法找到这个类模板的完整类型限定
template <typename T, unsigned int N, typename = void>
class A
{
A();
public:
T* data;
};
template <typename T, unsigned int N>
class A<T, N, typename std::enable_if<N == 3 || N == 4>::type>
{
A();
public:
T data[N];
};
到目前为止,我已经尝试了
template <typename T, unsigned int N, typename>
A<T,N>::A(){} //expected a ';' + expected a type specifier + expected an identifier
template <typename T, unsigned int N, typename>
A<T,N,typename>::A(){} //same errors but I believe this doesnt make sense at all
此外,在为成员函数编写实际代码时,如何区分通用模板和专业化?
答案 0 :(得分:4)
在class
定义之外实现函数的正确方法如下:
template <typename T, unsigned int N, typename U>
A<T, N, U>::A() { }
template <typename T, unsigned int N>
A<T, N, typename std::enable_if<N == 3 || N == 4>::type>::A() { }
在第一种情况下,即使void
作为默认模板参数提供,您仍然需要&#34;匹配&#34;它。考虑一些用户提供的类型与void
不同的情况。
在第二种情况下,您遗憾地需要重复enable_if
逻辑 - 这是类别别名的一个很好的用例,并且是实现成员的一个很好的例子类模板定义中的函数优于外部定义。