c – 如何使用默认模板参数分隔模板化类的声明和实现?
作者:互联网
我喜欢将我的类的声明和实现分开.我知道类模板和函数的实现也必须进入头文件,这不是问题.
我在实现这个课时遇到了麻烦:
template <size_t S, std::enable_if_t<(S > 0), int> = 0>
class Foo {
public:
Foo();
}
到目前为止,我尝试过:
template<size_t S>
Foo<S>::Foo() {}
哪个失败了
error C3860: template argument list following class template name must list parameters in the order used in template parameter list
error C2976: ‘Foo<S,<__formal>>’ : too few template arguments
和
template<size_t S, int i>
Foo<S, i>::Foo() {}
哪个失败了
error C3860: template argument list following class template name must list parameters in the order used in template parameter list
error C3855: ‘Foo<S,<unnamed-symbol>>’ : template parameter ‘__formal’ is incompatible with the declaration
我也尝试过将模板声明更改为
template< size_t S,typename = std :: enable_if_t<(S> 0)>>
这也失败了第一条错误消息.
这样做的正确方法是什么?
解决方法:
您无法部分专门化模板功能(这就是您在第一个代码段中所做的工作).如果你问的是如何在课外定义它,试试这个:
template <size_t S, std::enable_if_t<(S > 0), int> j>
Foo<S, j>::Foo(){}
你不能只是替换std :: enable_if_t<(S> 0),int> by int,因为定义不相等(enable_if一个SFINAE出S == 0的情况).
标签:c,templates,c14,sfinae,enable-if 来源: https://codeday.me/bug/20190828/1749617.html