Mark Mitchell <[EMAIL PROTECTED]> writes: > Ian Lance Taylor wrote: > > > ================================================== > > template <int dim> struct X { > > struct I { I(); void foo(); }; > > }; > > > > template <int dim> struct Y : X<dim> { > > typedef typename X<dim>::I I; > > }; > > > > template <int dim> > > void Y<dim>::I::foo () {} > > > > template struct Y<1>; > > ================================================== > > This should be invalid too, assuming I'm remembering correctly. I think > you have to say X<dim>::I::foo() when you make the definition.
(First of all, let me to say that I don't want to pick on Mark here, he's just the one answering.) OK, here is gcc/testsuite/g++.dg/eh/spec4.C: ================================================== // PR c++/5104 // Test that a function with a throw spec is a valid template argument. #include <exception> typedef void (*HandlerFunction)(); typedef HandlerFunction (*SetHandlerFunction)(HandlerFunction); template <SetHandlerFunction set_function> class HandlerStack { public: static void defaultHandler(); }; typedef HandlerStack<std::set_terminate> Terminate; template<> void Terminate::defaultHandler() {} ================================================== This test case uses a typedef when defining the function defaultHandler. Is this code legal? If yes, then what is the difference between this and the example above? A similar yet different case appears in g++.dg/parse/ctor2.C: ================================================== // PR c++/19244 typedef struct { void f(); } f; void f::f() { } ================================================== (These are, of course, cases I found with one version of my attempt to patch this PR.) Ian