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
,则会简单得多。