C++ 模板意大利面

C++ 模板意大利面,c++,templates,metaprogramming,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 <typen

请给那块模版意大利面加些光:

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{
公众:
T;
K;
模板结构AttributeType{
};
模板AttributeType getAttr();
};
模板模板A::AttributeType A::getAttr(){
返回t;
}
我无法找到正确的语法来定义
A::getAttr()
的实现。当前代码在getAttr定义行编译失败:

错误:不允许函数模板部分专用化“getAttr”

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

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

template <typename T, typename K>
template <int i>
typename A<T, K>::template AttributeType<i> A<T, K>::getAttr() {
    return t;
}
模板
模板
typename A::template AttributeType A::getAttr(){
返回t;
}
接下来,为每个模板部件指定自己的行是很有帮助的。让事情更清楚


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

哇,谢谢!你是一个真正的编译器负责人:)我只需要在
属性类型
之前添加
模板
,它就成功了:@ognian:Not
模板
类型名
。请参阅。@Xeo:template和typename:
模板模板typename A::模板AttributeType A::getAttr(){return t;}
@ognian:interest,VC10无法使用
模板编译。Brb.@ognian:这让我很困扰,所以请看一下。:)作为旁注,如果您在适当的位置定义模板的成员,而不是将它们拉到模板定义之外,那么事情通常会简单得多,而不是简单得多。也就是说,如果在声明它的地方定义了
getAttr
,则会简单得多。