来自母保护字段的非静态数据成员初始化

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.

你有什么想法我在这里做错了吗?

非常感谢你的帮助!

Que*_*tin 6

get是一个依赖名称(取决于T).您需要明确说明它是模板的名称:

float& b = A<T>::a.template get<float>();
Run Code Online (Sandbox Code Playgroud)

第二个是有效的,因为你明确地"崩溃" A<T>::a成了一个Builder&,它不再依赖T了.

第三个是有效的,因为你从完全专业化继承A<float>,这又不依赖于T.