我在使用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++标准,但旧的编译器缺乏同样的适当实现。
- 问题到底是什么?
- 有没有一种可移植的编写方式,让尽可能多的编译器都能接受它?
Base
不是“模板基类”。编辑:除非它被中介的模板基类所混淆? - Mark B需要符合规范的C++编译器才能发出诊断(错误/警告/其他消息)。如果编译器对格式不正确的程序没有发出错误,那就是编译器的一个bug
...这是否意味着4.5.2比4.3.2更有bug(因为它接受了代码)?对我来说,这更像是在暗示代码不是格式不正确,因为我相信gcc将朝着更好的符合性发展。 - twil