On Fri, Jul 15, 2005 at 02:46:50PM +0200, Mathieu Fluhr wrote: > Hello all > > I'm just wondering about some differences between g++ 3.3 (3.3.6) and > g++ 3.4 (3.4.5). Please have a look to this piece of code: > > ---8<--------------------------------------------- > #include <iostream> > > template <class ValueType> > class A > { > protected: > ValueType m_Field; > }; > > template <class ValueType> > class B : public A<ValueType> > { > void TestParam(ValueType i) > { > m_Field = i; > } > }; > > int main(void) > { > return 0; > } > > ---8<--------------------------------------------- > > As far as I know the C++ language, syntax seems to be correct, and g++ > 3.3 does not output any error/warning (even with -Wall option). The > problem is that g++ 3.4 (and 4.0 btw) outputs the following: > > For g++ 3.4: > > Inherit.cpp: In member function `void > B<ValueType>::TestParam(ValueType)': > Inherit.cpp:16: error: `m_Field' undeclared (first use this function) > Inherit.cpp:16: error: (Each undeclared identifier is reported only once > for each function it appears in.) > > For g++ 4.0: > > Inherit.cpp: In member function 'void > B<ValueType>::TestParam(ValueType)': > Inherit.cpp:16: error: 'm_Field' was not declared in this scope > > > The very weird thing is that if I change the line 16 from > m_Field = i; > to > this->m_Field = i; > > everything works without any kind of problem !!! So is this behaviour > normal ? > Hi, that's exactly correct: class B has a dependent base class, and thus members of this base class have to be qualified (see the standard, paragraph 14.6.2, point 4). Oliver P.S. A minor point: I think "int main(void)" is not standard --- according to 3.6.1, point 2 only "int main()" is guaranteed to work.