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

Oliver Kullmann O.Kullmann@swansea.ac.uk
Fri Jul 15 14:36:00 GMT 2005


On Fri, Jul 15, 2005 at 04:01:19PM +0200, Mathieu Fluhr wrote:
> Thanks for you quick answer. So I assume the best solution is to patch
> all C++ files that brings errors... Lots of work in perspective ;-)
>

but necessary
 
> BtW, regarding your PS, what is the difference between
> `int main(void)` and `int main()` ?
> 

it's just that I'm not aware of text in the standard
granting the use of `int main(void)`, while `int main()`
definitely is correct, so it might be that at some
time in the future `int main(void)` has to be changed
to `int main()`, and so I would avoid it.

Oliver

> Mathieu
> 
> On ven, 2005-07-15 at 14:09 +0100, Oliver Kullmann wrote:
> > 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.
> >  
> 

-- 
Dr. Oliver Kullmann
Computer Science Department
University of Wales Swansea
Faraday Building, Singleton Park
Swansea SA2 8PP, UK
http://cs-svr1.swan.ac.uk/~csoliver/



More information about the Gcc-help mailing list