Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从主保护字段初始化非静态数据成员_C++_Templates_C++11_Inheritance - Fatal编程技术网

C++ 从主保护字段初始化非静态数据成员

C++ 从主保护字段初始化非静态数据成员,c++,templates,c++11,inheritance,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 {}; temp

我在尝试使用非静态数据成员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;
}
如果我使用下面两行的技巧(以注释
work
作为后缀),我不理解为什么它不能像ti编译一样工作,这基本上是一样的

如果我的类不是模板,它也可以开箱即用。在这种情况下,我可以直接按受保护字段的名称访问该字段,而无需使用syntax
ParentClass::field

你知道我做错了什么吗


非常感谢你的帮助

这里的
get
是一个相关名称(它取决于
T
)。您需要明确说明它是模板的名称:

float& b = A<T>::a.template get<float>();
float&b=A::A.template get();
第二种方法之所以有效,是因为可以将
A::A
显式“折叠”为
Builder&
,而不再依赖于
T


第三个有效,因为您继承了完全专用的
A
,它同样不依赖于
T

,非常感谢您的解释,我不知道这种语法!使用
模板get
时,它工作正常!
float& b = A<T>::a.template get<float>();