c – 在bool值上从模板类重载成员
发布时间:2020-12-16 10:04:42 所属栏目:百科 来源:网络整理
导读:我试图避免在我的项目的主分支上的概念,所以我需要一些与type_trait的替代: 我需要一个类,根据bool值,一些函数会改变. 有人已经建议我分开我的班级,但这种情况在这里没有意义.对于某些上下文,它是一个池,其中删除函数,如果可以共享池的对象类型,则其他一些
我试图避免在我的项目的主分支上的概念,所以我需要一些与type_trait的替代:
我需要一个类,根据bool值,一些函数会改变. 有人已经建议我分开我的班级,但这种情况在这里没有意义.对于某些上下文,它是一个池,其中删除函数,如果可以共享池的对象类型,则其他一些将更改. 所以我尝试使用std :: enable_if,但仍然存在一些错误(我希望声明和实现是分开的). #include <type_traits> template < typename Object,bool Shared = false > class Foo { template < bool S = Shared,typename std::enable_if<S>::type* = nullptr > void bar(); template < bool S = Shared,typename std::enable_if<!S>::type* = nullptr > void bar(); }; template < typename Object,bool Shared > template < bool S,typename std::enable_if<S>::type* = nullptr > void Foo<Object,Shared>::bar() { //do something } template < typename Object,typename std::enable_if<!S>::type* = nullptr > void Foo<Object,Shared>::bar() { //do nothing } int main() { Foo<int> test; return 0; } Test3.cpp:16:33: error: default argument for template parameter for class enclosing ‘void Foo<Object,Shared>::bar()’ void Foo<Object,Shared>::bar() { ^ Test3.cpp:24:33: error: default argument for template parameter for class enclosing ‘void Foo<Object,Shared>::bar() { 编辑:删除了复制/粘贴错误 解决方法
1.对于类定义中的成员函数声明,应删除类名的限定(即Foo< Object,Shared>::).
2.Default template arguments不允许用于成员模板的类外定义,只需删除它们即可.
然后 template < typename Object,typename std::enable_if<S>::type* = nullptr > void bar(); template < bool S = Shared,typename std::enable_if<!S>::type* = nullptr > void bar(); }; template < typename Object,typename std::enable_if<S>::type* > void Foo<Object,Shared>::bar() { //do something } template < typename Object,typename std::enable_if<!S>::type* > void Foo<Object,Shared>::bar() { //do nothing } LIVE (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |