类模板的完整类型限定条件是什么?

时间:2017-05-05 12:36:21

标签: c++ templates

在这篇文章中回答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

此外,在为成员函数编写实际代码时,如何区分通用模板和专业化?

1 个答案:

答案 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逻辑 - 这是类别别名的一个很好的用例,并且是实现成员的一个很好的例子类模板定义中的函数优于外部定义。