C++ "error: "object missing in reference to ..." depends on gcc version
C++ "error: "object missing in reference to ..." depends on gcc version
我在使用一个 gcc 版本 (4.3.2) 时遇到编译错误,而使用较新版本的 gcc,例如4.5.2.
下面的例子说明了这个问题:
class Base {
protected:
int member;
};
template<typename T>
class A : public Base {
};
template<typename T>
class C : public A<T> {
C() {
Base::member = 1;
}
};
int main() {
}
对于 4.3.2,我得到:
test.cpp: In constructor 'C<T>::C()':
test.cpp:4: error: object missing in reference to 'Base::member'
test.cpp:14: error: from this location
对于 4.5.2,它编译得很好。
如果一个编译器版本接受该代码,那么它就不可能是完全错误的。我的猜测是它符合 C++ 标准,但较旧的编译器缺少相同的正确实现。
- 到底是什么问题?
- 是否有一种可移植的方式来编写这种代码,以便尽可能多的编译器接受它?
这绝对是早期版本的 g++ 中的一个错误,但解决方案很简单:只需将 this->
添加到表达式中,因为 this->Base::member = 1;
不会混淆编译器。
我在使用一个 gcc 版本 (4.3.2) 时遇到编译错误,而使用较新版本的 gcc,例如4.5.2.
下面的例子说明了这个问题:
class Base {
protected:
int member;
};
template<typename T>
class A : public Base {
};
template<typename T>
class C : public A<T> {
C() {
Base::member = 1;
}
};
int main() {
}
对于 4.3.2,我得到:
test.cpp: In constructor 'C<T>::C()':
test.cpp:4: error: object missing in reference to 'Base::member'
test.cpp:14: error: from this location
对于 4.5.2,它编译得很好。
如果一个编译器版本接受该代码,那么它就不可能是完全错误的。我的猜测是它符合 C++ 标准,但较旧的编译器缺少相同的正确实现。
- 到底是什么问题?
- 是否有一种可移植的方式来编写这种代码,以便尽可能多的编译器接受它?
这绝对是早期版本的 g++ 中的一个错误,但解决方案很简单:只需将 this->
添加到表达式中,因为 this->Base::member = 1;
不会混淆编译器。