其他分享
首页 > 其他分享> > c – 如何使用默认模板参数分隔模板化类的声明和实现?

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的情况).

Live snippet

标签:c,templates,c14,sfinae,enable-if
来源: https://codeday.me/bug/20190828/1749617.html