Tim Janik <[EMAIL PROTECTED]> writes: | hi all. | | the code snippet below is extracted from a much more | complicated piece of code. basically the problem is that | g++ (3.3 and 3.4) demand different typedef syntax inside | template bodies, depending on whether full or partial | specialization is used. | | is this really the correct behaviour and standard conform?
Yes. An explicit specialization is not a template. Therefore line20 is in error. | (to me it seems, line20 should still be considered part of | a template and thus accept the "typename") | | --------------------snip--------------------- | template<class C> | struct Base { | typedef C* Iterator; | }; | | template<class C, class D> | struct Derived : Base<D> { | typedef typename Base<D>::Iterator Iterator; | }; | | #define BASE_ITER(BASE) typename BASE :: Iterator | | template<class D> | struct Derived<char, D> : Base<D> { | typedef BASE_ITER (Base<D>) Iterator; // line15 | }; | | template<> | struct Derived<char, int> : Base<int> { | typedef BASE_ITER (Base<int>) Iterator; // line20 | }; | | // test.cc:20: error: using `typename' outside of template | --------------------snip--------------------- | | | --- | ciaoTJ | -- Gabriel Dos Reis [EMAIL PROTECTED]