Re: aren't specialized templates templates?

2005-02-13 Thread Martin Sebor
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?

2005-02-12 Thread Gabriel Dos Reis
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]