我在尝试使用非静态数据成员init时遇到问题。在复杂的模板继承链中。我附上一个小的非工作示例:
struct Builder {
template <typename T> T& get() {
return a;
};
float a = 5;
};
struct Base {
Builder a;
};
template <typename T> struct A: public Base {};
template <typename T> struct B: public A<T> {
float& b = (A<T>::a).get<float>(); // Do not work
Builder& builder = A<T>::a;
float& c = builder.get<float>(); // Work
};
struct C: public A<float> {
float& b = a.get<float>(); // Work
};
int main() {
return 0;
}
我对class B
最感兴趣。我使用gcc 4.9.2编译错误:
error: expected primary-expression before ‘float’
float& b = (A<T>::a).get<float>(); // Do not work
我不明白为什么它不能正常工作,如果我使用下面两行的技巧(后缀为注释Work
),这基本上是相同的。
如果我的课不是模板,它也可以开箱即用。在这种情况下,我可以直接访问受保护字段的名称,而无需使用语法ParentClass<T>::field
。
你对我在这里做错了什么有什么想法吗?
非常感谢你的帮助!
答案 0 :(得分:6)
此处get
是从属名称(取决于T
)。您需要明确说明它是模板的名称:
float& b = A<T>::a.template get<float>();
第二个有效,因为你明确&#34;崩溃&#34; A<T>::a
Builder&
T
,不再依赖A<float>
。
第三个是有效的,因为你继承了完全专业化的T
,这又不依赖于boundingRectWithSize:
。