2017-05-05 65 views
1

继这个职位的答案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

请在问题中发布所有相关信息 - 不要依赖其他人将遵循链接的事实。请记住,一个好的[MCVE]是关键。 –

回答

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是为默认模板参数提供,你仍然需要“匹配“它。考虑一些用户提供的不同于void的类型的情况。

在第二种情况下,你不幸需要重复enable_if逻辑 - 这是一个很好的用例为类型别名,以及为什么实施类模板定义里面成员函数一个很好的例子优于外部定义。

+2

好吧,我看到了,模板参数的名称刚刚被避免,因为它没有在模板中使用。我瘦了'template '与'template '相同,现在更有意义。 – BRabbit27

相关问题