The following code complies with GCC 4.3.0-2 and presumably older versions
(also tested with 3.4), but fails under GCC 4.4.0:
template<typename T>
class C {
template <typename U> class D {};
friend class C::D<int>;
};
The message it outputs is:
$ /s/gcc-4.4.0/bin/g++ test.cc
test.cc:5: error: typename C<T>::D names template<class T> template<class
U> class C<T>::D, which is not a type
Here is compiler information (though it also failed under what IIRC is a Mingw
build of 4.5 experimental so I doubt this matters):
$ /s/gcc-4.4.0/bin/g++ -v
Reading specs from /../lib/gcc/i686-pc-linux-gnu/4.4.0/specs
Target: i686-pc-linux-gnu
Configured with: ../gcc-4.4.0/configure --prefix=/s/gcc-4.4.0/i386_rhel5
--enable-shared --enable-threads --with-pic --enable-languages=c,c++,fortran
--with-gmp=/s/gmp-4.3.0/ --with-mpfr=/s/mpfr-2.4.1/
--with-mpfr-include=/s/mpfr-2.4.1/include --with-mpfr-lib=/s/mpfr-2.4.1/lib
Thread model: posix
gcc version 4.4.0 (GCC)
Things that allow the example to compile:
1. Remove the qualification (change 'C::D<int>' to just 'D<int>')
2. Make D not a template
3. Make C not a template
I can't say definitively that this is a bug and not just a change within an
ambiguity of the C++ standard (or even fixing a bug that used to permit illegal
code), but older versions of GCC, Intel CC 11, and Comeau's "try it out" online
thing all accept that snippet. However, it does have an easy fix, so even
though I encountered this issue in production code, it's not a big deal.
--
Summary: Error when using a qualified name to declare a nested
template instantiation as a friend of the containing
template
Product: gcc
Version: 4.4.0
Status: UNCONFIRMED
Severity: minor
Priority: P3
Component: c++
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: evaned at gmail dot com
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=41723