This problem evolved out of my trying to implement a context aware logger. It appears that template classes with template parameters that themselves have template parameters can cause gcc to be unable to select an overload from the class correctly and incorrectly goes to the file scope for the default method. It's very confusing and hard to explain... I will paste the code below, but hopefully there is a attach function I can use later on to just attach the source file.
In VC6.0, the code prints the following when run: I'd really love to call my base class'es method ... and the base class is indeed printing as I had hoped it would. In GCC 3.4.1, the code prints the following (undesired/incorrect?) when run: I'd really love to call my base class'es method... but the file scoped function is selected! WAH! Why does GCC and/or the C++ standard hate me so!? I believe there is something specific about the following line that the compiler is not processing correctly: template<class ANYTYPE2> class DERIVED : public BASETEMPLATE< DERIVED<ANYTYPE2> > using GCC from mingw: Reading specs from ../lib/gcc/mingw32/3.4.1/specs Configured with: ../gcc/configure --with-gcc --with-gnu-ld --with-gnu-as --host=mingw32 --target=mingw32 --prefix=/mingw --enable-threads --disable-nls --enable-languages=c,c++,f77,ada,objc,java --disable-win32-registry --disable-shared --enable-sjlj-exceptions --enable-libgcj --disable-java-awt --without-x --enable-java-gc=boehm --disable-libgcj-debug --enable-interpreter --enable-hash-synchronization --enable-libstdcxx-debug Thread model: win32 gcc version 3.4.1 (mingw special) compiled with: gcc -c -g -mwindows -DWIN32 -D_WINDOWS -D_DEBUG -IC:\devproject\woldie\protos -std=gnu++98 -felide-constructors -frepo -fshort-enums -fshort-wchar -fkeep-static-consts -ftemplate-depth-255 -mms-bitfields -march=i586 -malign-stringops -mfancy-math-387 -mhard-float -mfp-ret-in-387 -m32 -mno-mmx-mno-3dnow -mno-sse -mno-sse2 -mno-sse3 C:\devproject\woldie\protos\testforfails.cpp linked with: gcc -g -Wl,--force-exe-suffix -o protos protos\Debug\testforfails.o -LC:\MinGW\lib\debug -Wl,-Bstatic -lstdc++ -Wl,-Bstatic -lsupc++ -lkernel32 -luser32 -lgdi32 -lwinspool -lcomdlg32 -ladvapi32 -lshell32 -lole32 -loleaut32 -luuid -lodbc32 -lodbccp32 here's the code: #include <stdio.h> class BASEOFBASE { public: BASEOFBASE(void) {} virtual ~BASEOFBASE(void) {} }; extern BASEOFBASE& PrintSumpthin(void); template<class ANYTYPE> class BASETEMPLATE : public BASEOFBASE { private: mutable int whocaresjustignoreme; protected: BASETEMPLATE(void) {} friend BASEOFBASE& ::PrintSumpthin(void); public: virtual const BASEOFBASE& PrintSumpthin(void) const { printf(" ... and the base class is indeed printing as I had hoped it would.\n"); return(*this); } virtual BASEOFBASE& PrintSumpthin(void) { printf(" ... and the base class is indeed printing as I had hoped it would.\n"); return(*this); } public: virtual ~BASETEMPLATE(void) {} }; template<class ANYTYPE2> class DERIVED : public BASETEMPLATE< DERIVED<ANYTYPE2> > { private: ANYTYPE2 thistoodoesnotmatterawhit; public: DERIVED(void) {} ~DERIVED(void) {} void ImGonnaPrint(void) { printf("I'd really love to call my base class'es method"); PrintSumpthin(); } }; int main(int argc, char** argv) { DERIVED<char>* myDerived = new DERIVED<char>(); myDerived->ImGonnaPrint(); return(0); } BASEOFBASE& PrintSumpthin(void) { static BASETEMPLATE<int> thisisjustheretoconfuse; printf("... but the file scoped function is selected! WAH! Why does GCC and/or the C++ standard hate me so!?\n"); return(thisisjustheretoconfuse); } -- Summary: Function overload being selected from file scope instead of template class scope when called from base template class Product: gcc Version: 3.4.1 Status: UNCONFIRMED Severity: normal Priority: P2 Component: c++ AssignedTo: unassigned at gcc dot gnu dot org ReportedBy: dwoldrich_ebay at yahoo dot com CC: gcc-bugs at gcc dot gnu dot org http://gcc.gnu.org/bugzilla/show_bug.cgi?id=18072