http://gcc.gnu.org/bugzilla/show_bug.cgi?id=60274
Bug ID: 60274 Summary: String as template parameter - regression in 4.8.2 Product: gcc Version: 4.8.2 Status: UNCONFIRMED Severity: normal Priority: P3 Component: c++ Assignee: unassigned at gcc dot gnu.org Reporter: ondrej.kolacek1 at centrum dot cz Greetings, this issue happened to me with Debian's g++ so it is possible it is just their bug but hopefully (well this is debatable :) ) it is not. <begin file test.cpp> typedef const char *const& ProtocolIdType; //typedef int ProtocolIdType; template <ProtocolIdType protocolId> class C { public: typedef int ProtocolVersion; class D { public: ProtocolVersion GetProtocolVersion(); }; }; template <ProtocolIdType protocolId> typename C<protocolId>::ProtocolVersion C<protocolId>::D::GetProtocolVersion() { return 1; } int main(void) { } <end file test.cpp> >g++ test.cpp test.cpp:18:41: error: prototype for ‘typename C<protocolId>::ProtocolVersion C<protocolId>::D::GetProtocolVersion()’ does not match any in class ‘C<protocolId>::D’ typename C<protocolId>::ProtocolVersion C<protocolId>::D::GetProtocolVersion() ^ test.cpp:13:19: error: candidate is: C<protocolId>::ProtocolVersion C<protocolId>::D::GetProtocolVersion() ProtocolVersion GetProtocolVersion(); The code used to work for ages, is compilable with MSVC, clang and gcc on various platforms, was compilable with 4.8.1 but broke with 4.8.2. The issue is with string template parameter; replacing typedef const char *const& ProtocolIdType; by typedef int ProtocolIdType; makes the error go away. > g++ -v Using built-in specs. COLLECT_GCC=g++ COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.8/lto-wrapper Target: x86_64-linux-gnu Configured with: ../src/configure -v --with-pkgversion='Debian 4.8.2-15' --with-bugurl=file:///usr/share/doc/gcc-4.8/README.Bugs --enable-languages=c,c++,java,go,d,fortran,objc,obj-c++ --prefix=/usr --program-suffix=-4.8 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --with-gxx-include-dir=/usr/include/c++/4.8 --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --enable-gnu-unique-object --disable-libmudflap --enable-plugin --with-system-zlib --disable-browser-plugin --enable-java-awt=gtk --enable-gtk-cairo --with-java-home=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64/jre --enable-java-home --with-jvm-root-dir=/usr/lib/jvm/java-1.5.0-gcj-4.8-amd64 --with-jvm-jar-dir=/usr/lib/jvm-exports/java-1.5.0-gcj-4.8-amd64 --with-arch-directory=amd64 --with-ecj-jar=/usr/share/java/eclipse-ecj.jar --enable-objc-gc --enable-multiarch --with-arch-32=i586 --with-abi=m64 --with-multilib-list=m32,m64,mx32 --with-tune=generic --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=x86_64-linux-gnu Thread model: posix gcc version 4.8.2 (Debian 4.8.2-15)