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