请在那块令人费解的模板意大利面上点亮一下:
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
我应该如何重新定义函数定义?
答案 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
的转换构造函数?