我有一个模板类的场景
template<typename X,typename Y> class Foo { typedef Y::nestedType Bar; int A (Bar thing); void B(); int C(X that); // other stuff };
然后我希望A()方法在X是给定类型时具有不同的行为(但是B和C可以保持不变,而实际代码实际上有大约10种其他方法,其中一些方法非常冗长,经常调整..所以我宁愿避免进行全班专业化并复制和粘贴完整的类实现)
我继续写道:
template<typename T> int Foo<MyType,T>::A(Bar thing);
但我的编译器(clang 163.7.1)甚至拒绝将其视为任何类型的模板特化.
在我编写代码的方式中是否隐藏了一些语法错误,或者这种编码风格是无效的?不幸的是,即使其他编译器确实支持这个成语,我的公司仍然坚持使用clang.
感谢您的帮助.
解决方法
使用重载
template<typename X,typename Y> class Foo { // allows to wrap up the arguments template<typename,typename> struct Types { }; typedef Y::nestedType Bar; int A (Bar thing) { return aimpl(thing,Types<X,Y>()); } void B(); int C(X that); // other stuff private: template<typename X1,typename Y1> int aimpl(Bar thing,Types<X1,Y1>) { /* generic */ } template<typename Y1> int aimpl(Bar thing,Types<SpecificType,Y1>) { /* special */ } };
您不能部分专门化类模板的成员.你写的是类模板本身的部分特化的成员函数A的定义.
原文地址:https://www.jb51.cc/c/119669.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。