Re: aren't specialized templates templates?
Tim Janik wrote: 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? (to me it seems, line20 should still be considered part of a template and thus accept the typename) Unfortunately, it is the correct behavior. But because it makes typename hard to use, a relaxation of the rule that would make your code well-formed is now being considered. For the status of this proposed change see: http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#382 Martin snip- templateclass C struct Base { typedef C* Iterator; }; templateclass C, class D struct Derived : BaseD { typedef typename BaseD::Iterator Iterator; }; #define BASE_ITER(BASE) typename BASE :: Iterator templateclass D struct Derivedchar, D : BaseD { typedef BASE_ITER (BaseD) Iterator; // line15 }; template struct Derivedchar, int : Baseint { typedef BASE_ITER (Baseint) Iterator; // line20 }; // test.cc:20: error: using `typename' outside of template snip- --- ciaoTJ
Re: aren't specialized templates templates?
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- | templateclass C | struct Base { |typedef C* Iterator; | }; | | templateclass C, class D | struct Derived : BaseD { |typedef typename BaseD::Iterator Iterator; | }; | | #define BASE_ITER(BASE) typename BASE :: Iterator | | templateclass D | struct Derivedchar, D : BaseD { |typedef BASE_ITER (BaseD) Iterator; // line15 | }; | | template | struct Derivedchar, int : Baseint { |typedef BASE_ITER (Baseint) Iterator; // line20 | }; | | // test.cc:20: error: using `typename' outside of template | snip- | | | --- | ciaoTJ | -- Gabriel Dos Reis [EMAIL PROTECTED]