| re: Q: typename or not typename?
Jakob Bieling wrote:[color=blue]
> I recently switched compilers (VC++7.1 to VC++8) and it started
> complaining about my use of 'typename' in template classes. So far, I
> have never fully understood where I need to put 'typename' and where
> not. Please consider the following snippet:
>
> #include <list>
>
> template <typename T>
> struct test_case
> {
> test_case (/* (1) */T::iterator i = (/* (2) */T::iterator ())
> {
> (/* (3) */T::iterator ii;[/color]
(1): yes, (2): no, (3): yes.
[color=blue]
> }
> };
>
> int main (int argc, char* argv [])
> {
> test_case <std::list <int> > foo;
> }
>
> As you can see, I marked three spots. In (1), the compiler requires
> me to put 'typename'. In (2) I am not allowed to. In (3) it compiles
> with or without.
>
> Why those differences? And what is the reasoning behind requiring it
> at all?[/color]
It's required for (1) because you need to help your compiler to understand
that what it's compiling is a declaration (same with (3)). However, since
(2) is the expression, 'typename' has to be omitted.
Imagine that you try to instantiate your 'test_case' template with a class
that has 'iterator' as a function or a data member? _You_ know that it is
not in 'std::list<int>' but when the compiler first looks at the template,
it has no way to know.
V
--
Please remove capital As from my address when replying by mail |