template parameters are hidden by class members

From: Gianni Mariani (gi2nospam_at_mariani.ws)
Date: 02/02/04


Date: 02 Feb 2004 13:38:19 EST


I was a little surprised by this:

It seems like the code below should not compile but the Comeau 4.3.3
compiler accepts it and the gcc 3.4(prerel) compiler rejects it and
MSVC++7.1 ICE's.

14.6.1 in the standard seems to imply that template parameters are
hidden by class members.

struct X
{
     struct C { int x; };
     class Z { Z(int){} };

     template<typename T,typename A, template<typename,typename> class C>
     C<T, A> Func()
     {
         return C<T, A>(); // should find X::C which is not a template
     }

     template< typename Z > Z Zunc()
     {
         return Z(); //this is X::Z and fail on undefined constructor
     }

     template< typename Z > void Zinc()
     {
     }

     void tst()
     {
         Zunc<int>();

         Zinc<int>();
     }
};

Notch that up to another C++ lesson.