模板意粉

时间:2011-06-03 20:06:18

标签: c++ templates metaprogramming

请在那块令人费解的模板意大利面上点亮一下:

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<i>’ is not allowed

我应该如何重新定义函数定义?

1 个答案:

答案 0 :(得分:7)

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

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

接下来,为每个模板部分提供自己的行是有帮助的。使事情更清楚。

除此之外,该函数看起来有误,或者AttributeType是否有来自T的转换构造函数?