【问题标题】:Template spaghetti模板意大利面
【发布时间】:2011-06-03 20:06:17
【问题描述】:

请对那块莫名其妙的模板意大利面有所了解:

template <typename T, typename K> class A {
public:
    T t;
    K k;

    template <int i, int unused = 0> struct AttributeType {
    };

    template <int i> AttributeType<i> getAttr();

};

template <typename T, typename K> template <int i> A<T, K>::AttributeType<i> A<T, K>::getAttr<i>() {
    return t;
}

我无法想出正确的语法来定义A::getAttr() 的实现。当前代码在getAttr定义行编译失败:

error: function template partial specialization ‘getAttr&lt;i&gt;’ is not allowed

我应该如何改写函数定义?

【问题讨论】:

  • 作为附注,而不是答案,如果您定义模板的成员,而不是将它们拉到模板之外,事情通常会简单得多定义。也就是说,如果getAttr 被定义在它被声明的地方会简单得多。

标签: c++ templates metaprogramming


【解决方案1】:

删除函数名称后面的&lt;i&gt;,并在返回类型之前添加一个typename,它是一个依赖名称。此外,它在AttributeType 之前缺少template,因为那是一个模板:

template <typename T, typename K>
template <int i>
typename A<T, K>::template AttributeType<i> A<T, K>::getAttr() {
    return t;
}

接下来,为每个模板部分提供自己的行会很有帮助。让内容更清晰。

除此之外,函数看起来有问题,还是AttributeType 有来自T 的转换构造函数?

【讨论】:

  • 哇,谢谢!你是一个真正的编译器负责人:) 我只需要在 AttributeType 之前添加 template 就可以了:
  • @ognian:不是templatetypename。见this FAQ
  • @Xeo:模板类型名:template &lt;typename T, typename K&gt; template &lt;int i&gt; typename A&lt;T, K&gt;::template AttributeType&lt;i&gt; A&lt;T, K&gt;::getAttr() { return t; }
  • @ognian:有趣的是,VC10 无法使用template 编译。 brb。
  • @ognian:这让我很困扰,所以请看一下this follow-up question。 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-06
  • 1970-01-01
相关资源
最近更新 更多