首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >部分模板专门化

部分模板专门化
EN

Stack Overflow用户
提问于 2011-08-19 03:01:06
回答 1查看 2.2K关注 0票数 7

我有一个场景,其中有一个模板类

代码语言:javascript
复制
template<typename X, typename Y>
class Foo
{
 typedef Y::NestedType Bar;

 int A (Bar thing);
 void B();
 int C(X that);

 // other stuff
};

然后,我希望当X是给定类型时,A()方法具有不同的行为(但B和C可以保持不变,并且实际代码实际上有大约10个其他方法,其中一些方法相当长,并且经常进行调整。因此,我宁愿避免进行全类专门化,并复制和粘贴全类实现)

我继续写道:

代码语言:javascript
复制
template<typename T>
int Foo<MyType, T>::A(Bar thing);

但我的编译器(clang 163.7.1)甚至拒绝将其视为任何类型的模板专门化。

我写代码的方式中是否隐藏了一些语法错误,或者这种编码风格是否无效C++?不幸的是,即使其他编译器支持这个习惯用法,我的公司仍然坚持使用clang。

谢谢你在这方面的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-08-19 03:10:20

使用重载

代码语言:javascript
复制
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的定义。

票数 7
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7112680

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档