g++ 3.4 more restrictive than g++ 3.3 ?

Oliver Kullmann O.Kullmann@swansea.ac.uk
Fri Jul 15 13:09:00 GMT 2005


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.
 



More information about the Gcc-help mailing list