Connecting Tech Pros Worldwide Help | Site Map

Q: typename or not typename?

  #1  
Old March 14th, 2006, 03:35 PM
Jakob Bieling
Guest
 
Posts: n/a
Hi,

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;
}
};

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?

Thanks for your time!
--
jb

(reply address in rot13, unscramble first)


  #2  
Old March 14th, 2006, 03:55 PM
Victor Bazarov
Guest
 
Posts: n/a

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
  #3  
Old March 14th, 2006, 03:55 PM
Rolf Magnus
Guest
 
Posts: n/a

re: Q: typename or not typename?


Jakob Bieling wrote:
[color=blue]
> Hi,
>
> 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.[/color]

You need it if the type depends on a template argument.
[color=blue]
> 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;
> }
> };
>
> 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.[/color]

Hmm, I would have expected that it's needed in all three places. My compiler
(g++) requires it in (1) and (3) and doesn't care in (2).
[color=blue]
> Why those differences? And what is the reasoning behind requiring it
> at all?[/color]

Because in some situations, it's quite some extra work for the compiler to
find out whether T::iterator is the name of a type or a variable, since it
doesn't know anything about T yet when parsing the template. To reduce
context dependancies, 'typename' is used to tell the compiler that the name
denotes a type.

Closed Thread


Similar Threads
Thread Thread Starter Forum Replies Last Post
To use or not to use smart pointers? Boris answers 54 July 29th, 2007 06:35 PM
boost facilities for determining whether or not a type supports particularsyntax? Howard Gardner answers 17 April 25th, 2006 03:15 AM
Is this code supposed to throw or not ? Gianni Mariani answers 3 July 19th, 2005 06:28 PM
ambiguous or not? catcher answers 3 July 19th, 2005 03:42 PM