Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 类之外的类函数模板定义_C++_Templates_Sfinae - Fatal编程技术网

C++ 类之外的类函数模板定义

C++ 类之外的类函数模板定义,c++,templates,sfinae,C++,Templates,Sfinae,因此,我一直在编写自己独特的_ptr类,我必须以与处理其他类型不同的方式处理数组 样板 类作用域\u ptr final{ 私人: typedef std::删除\u区段\u t gen; gen*m_数据; 公众: //一些方法 无效重置; }; 样板 内联无效作用域\u ptr::重置 { //一些代码。。。 } 问题是,当使用std::enable_时,如果出现以下错误,我希望reset方法仅对非数组分配可用:尽管代码仍在编译,但无法在类模板的类外成员的声明中指定默认模板参数 样板 类作用

因此,我一直在编写自己独特的_ptr类,我必须以与处理其他类型不同的方式处理数组

样板 类作用域\u ptr final{ 私人: typedef std::删除\u区段\u t gen; gen*m_数据; 公众: //一些方法 无效重置; }; 样板 内联无效作用域\u ptr::重置 { //一些代码。。。 } 问题是,当使用std::enable_时,如果出现以下错误,我希望reset方法仅对非数组分配可用:尽管代码仍在编译,但无法在类模板的类外成员的声明中指定默认模板参数

样板 类作用域\u ptr final{ 公众: 样板 无效重置; }; 样板 样板 内联无效作用域\u ptr::重置 { } 我也尝试过这个,但它也给出了一个错误:模板参数列表必须匹配参数列表

样板 内联无效作用域\u ptr::重置 { } 有人知道如何禁用数组的此方法吗?我知道我可以专门化类范围的\u ptr,但我想避免代码重复。有什么办法吗

编辑:

阅读回复后,我将代码更改为:

样板 类作用域\u ptr final{ 私人: typedef std::删除\u区段\u t gen; gen*m_数据; 公众: //一些方法 样板 无效重置; }; 样板 样板 内联无效作用域\u ptr::重置 { } 在我尝试调用该方法之前,代码编译时不会出错:

int main{ 作用域_ptr ptr=new int; ptr.reset; } 这就是我得到的错误:void scoped_ptr«int,false»::resetvoid:无法推断«unnamed symbol»的模板参数

但是如果我在类内部编写实现,错误就会消失。如何修复此问题?

如果要使重置SFINAE友好,请将其设置为假模板:

template<bool is_arr = _arr, typename = std::enable_if_t<is_arr>>
void reset();
如果将有效行替换为无效行,它将无法编译

编辑2

在类外定义成员函数时,不会重复模板参数的默认值:

template<class T, bool f>
template<bool, typename>
void S<T, f>::reset() { }
此名称应与声明中的名称匹配。

如果要使重置SFINAE友好,请将其设置为假模板:

template<bool is_arr = _arr, typename = std::enable_if_t<is_arr>>
void reset();
如果将有效行替换为无效行,它将无法编译

编辑2

在类外定义成员函数时,不会重复模板参数的默认值:

template<class T, bool f>
template<bool, typename>
void S<T, f>::reset() { }

此名称应与声明中的名称相匹配。

那么何时应使用假模板?使用std::enable_时,类型_traits中是否有任何其他函数需要它?模板参数不是与类模板参数同时求值吗?@Nough_mark,我更新了我的答案并确认OP的SFINAE是错误的。是的,我也意识到了这一点。@Denomycor,你需要SFINAE时使用假模板。SFINAE仅在实例化模板时有效,仅当条件取决于模板参数时有效,并且仅当错误发生在此处时有效。enable_if是实现SFINAE的规范模板,但也可以在没有它的情况下实现。@Denomycor,顺便说一句,has_reset是使用SFINAE实现的。那么什么时候应该使用伪模板呢?使用std::enable_时,类型_traits中是否有任何其他函数需要它?模板参数不是与类模板参数同时求值吗?@Nough_mark,我更新了我的答案并确认OP的SFINAE是错误的。是的,我也意识到了这一点。@Denomycor,你需要SFINAE时使用假模板。SFINAE仅在实例化模板时有效,仅当条件取决于模板参数时有效,并且仅当错误发生在此处时有效。如果是实现SFINAE的规范模板,则启用\u,但也可以在没有它的情况下实现。@Denomycor,顺便说一句,已使用SFINAE实现了\u重置。请尝试用模板替换模板。看起来像是微软编译器中的一个bug。哇,这在所有方面对thx都有很大帮助,我还应该注意到我在使用Visual Studio 19。这个bug总是在这种情况下发生吗?我应该注意什么?这些错误是非常不可预测的,没有通用的方法来避免它们以及如何修复它们。说到模板,我在MSVC中见过很多。我建议尝试另一个编译器,比如gcc,看看它是否编译了代码,再修改一下,让它与MSVC一起工作。添加多余的参数名纯粹是我的猜测。请尝试用模板替换模板。看起来像是微软编译器中的一个bug。哇,这在所有方面对thx都有很大帮助,我还应该注意到我在使用Visual Studio 19。这个bug总是在这种情况下发生吗?我应该注意什么?这些错误是非常不可预测的,没有通用的方法来避免它们以及如何修复它们 他们说到模板,我在MSVC中见过很多。我建议尝试另一个编译器,比如gcc,看看它是否编译了代码,再修改一下,让它与MSVC一起工作。添加一个冗余的参数名纯粹是我的猜测。
template<class T, bool f>
template<bool _f, typename>
void S<T, f>::reset() { }