This is the mail archive of the
gcc-help@gcc.gnu.org
mailing list for the GCC project.
Re: g++ 3.4 more restrictive than g++ 3.3 ?
- From: Oliver Kullmann <O dot Kullmann at swansea dot ac dot uk>
- To: Mathieu Fluhr <mfluhr at nero dot com>
- Cc: gcc-help at gcc dot gnu dot org
- Date: Fri, 15 Jul 2005 14:09:33 +0100
- Subject: Re: g++ 3.4 more restrictive than g++ 3.3 ?
- References: <1121431610.21076.9.camel@localhost.localdomain>
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.