C++ 从主保护字段初始化非静态数据成员
我在尝试使用非静态数据成员init时遇到问题。在复杂模板继承链中。我附上一个小的非工作示例: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
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编译一样工作,这基本上是一样的
如果我的类不是模板,它也可以开箱即用。在这种情况下,我可以直接按受保护字段的名称访问该字段,而无需使用syntaxParentClass::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>();