c – 部分模板专业化

我有一个模板类的场景
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的定义.

相关文章

本程序的编译和运行环境如下(如果有运行方面的问题欢迎在评...
水了一学期的院选修,万万没想到期末考试还有比较硬核的编程...
补充一下,先前文章末尾给出的下载链接的完整代码含有部分C&...
思路如标题所说采用模N取余法,难点是这个除法过程如何实现。...
本篇博客有更新!!!更新后效果图如下: 文章末尾的完整代码...
刚开始学习模块化程序设计时,估计大家都被形参和实参搞迷糊...