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

时间:2015-07-02 10:58:26

标签: c++ templates c++11 inheritance

我在尝试使用非静态数据成员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

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

非常感谢你的帮助!

1 个答案:

答案 0 :(得分:6)

此处get是从属名称(取决于T)。您需要明确说明它是模板的名称:

float& b = A<T>::a.template get<float>();

第二个有效,因为你明确&#34;崩溃&#34; A<T>::a Builder& T,不再依赖A<float>

第三个是有效的,因为你继承了完全专业化的T,这又不依赖于boundingRectWithSize: