Séb*_*ien 2 c++ inheritance templates c++11
我在尝试使用非静态数据成员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;
}
Run Code Online (Sandbox Code Playgroud)
我最感兴趣的是class B.我使用gcc 4.9.2编译错误:
error: expected primary-expression before ‘float’
float& b = (A<T>::a).get<float>(); // Do not work
Run Code Online (Sandbox Code Playgroud)
我不明白为什么它不起作用,因为如果我使用下面的两行(后缀为注释Work),这基本上是相同的东西.
如果我的课程不是模板,它也可以开箱即用.在这种情况下,我可以直接访问受保护字段的名称,而无需使用语法ParentClass<T>::field.
你有什么想法我在这里做错了吗?
非常感谢你的帮助!
这get是一个依赖名称(取决于T).您需要明确说明它是模板的名称:
float& b = A<T>::a.template get<float>();
Run Code Online (Sandbox Code Playgroud)
第二个是有效的,因为你明确地"崩溃" A<T>::a成了一个Builder&,它不再依赖T了.
第三个是有效的,因为你从完全专业化继承A<float>,这又不依赖于T.
| 归档时间: |
|
| 查看次数: |
78 次 |
| 最近记录: |