Why do I need the typename keyword?

Discussion in 'C++' started by Anonymous, Apr 13, 2004.

  1. Anonymous

    Anonymous Guest

    I'm trying to port code from VC.net to VC.net 2003. Here's a typical
    piece of code that's often used:


    template<class T> class PseudoContainer {
    typedef T::iterator iterator; // this line will change in the next
    example...
    };


    This compiles just fine under VC.net but it will not compile under VC.net
    2003. In order to get this to compile with the new compiler, I need to add
    the typename keyword, like so:


    template<class T> class PseudoContainer {
    typedef typename T::iterator iterator; // this line was changed from
    the previous example...
    };


    Now, I can actually understand why you need the typename keyword. It's
    because the compiler can't tell if T::iterator is a type or a static member
    of T. Thus, you must tell it with the typename keyword. However, if that's
    the case, then why did it compile just fine under VC.net?

    Any insight into this will be greatly appreciated!
     
    Anonymous, Apr 13, 2004
    #1
    1. Advertising

  2. "Anonymous" <> wrote in message
    news:gyYec.1179$...
    > I'm trying to port code from VC.net to VC.net 2003. Here's a typical
    > piece of code that's often used:
    >
    >
    > template<class T> class PseudoContainer {
    > typedef T::iterator iterator; // this line will change in the next
    > example...
    > };
    >
    >
    > This compiles just fine under VC.net but it will not compile under VC.net
    > 2003. In order to get this to compile with the new compiler, I need to add
    > the typename keyword, like so:
    >
    >
    > template<class T> class PseudoContainer {
    > typedef typename T::iterator iterator; // this line was changed from
    > the previous example...
    > };
    >
    >
    > Now, I can actually understand why you need the typename keyword. It's
    > because the compiler can't tell if T::iterator is a type or a static

    member
    > of T. Thus, you must tell it with the typename keyword. However, if that's
    > the case, then why did it compile just fine under VC.net?
    >
    > Any insight into this will be greatly appreciated!



    typename is used when writing templates and accessing other template member
    *types*. Since you access the type inside of a template and not of an
    instance, it would be hard work for the compiler to distinguish such things,
    so you tell the compiler explicitly that it is a type defined inside a
    template and not in a class or function (or template instance which is also
    a class or function).

    (E.g. vector<int> is a class, vector is a template).






    Ioannis Vranos
     
    Ioannis Vranos, Apr 13, 2004
    #2
    1. Advertising

  3. Anonymous

    John Carson Guest

    "Anonymous" <> wrote in message
    news:gyYec.1179$
    > I'm trying to port code from VC.net to VC.net 2003. Here's a
    > typical piece of code that's often used:
    >
    >
    > template<class T> class PseudoContainer {
    > typedef T::iterator iterator; // this line will change in the
    > next example...
    > };
    >
    >
    > This compiles just fine under VC.net but it will not compile under
    > VC.net 2003. In order to get this to compile with the new compiler, I
    > need to add the typename keyword, like so:
    >
    >
    > template<class T> class PseudoContainer {
    > typedef typename T::iterator iterator; // this line was changed
    > from the previous example...
    > };
    >
    >
    > Now, I can actually understand why you need the typename keyword.
    > It's because the compiler can't tell if T::iterator is a type or a
    > static member of T. Thus, you must tell it with the typename keyword.
    > However, if that's the case, then why did it compile just fine under
    > VC.net?
    >
    > Any insight into this will be greatly appreciated!



    VC++ 7.1 is more standard conforming than VC++ 7.0, which means that some
    things 7.0 allowed are no longer allowed in 7.1. Some of these changes may
    have been just for the sake of being conformant to the standard; others may
    be because 7.0 allowed you to do things that caused ambiguities (perhaps
    only in special cases) that the compiler writers had not fully appreciated
    at the time 7.0 was written.


    --
    John Carson
    1. To reply to email address, remove donald
    2. Don't reply to email address (post here instead)
     
    John Carson, Apr 13, 2004
    #3
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Chris Foster
    Replies:
    2
    Views:
    386
    Chris Foster
    Aug 23, 2004
  2. Exits Funnel
    Replies:
    1
    Views:
    320
    Sharad Kala
    Jan 8, 2005
  3. Mr. SweatyFinger
    Replies:
    2
    Views:
    2,002
    Smokey Grindel
    Dec 2, 2006
  4. Jakob Bieling

    Q: typename or not typename?

    Jakob Bieling, Mar 14, 2006, in forum: C++
    Replies:
    2
    Views:
    356
    Rolf Magnus
    Mar 14, 2006
  5. Replies:
    6
    Views:
    458
    Peter Otten
    May 10, 2007
Loading...

Share This Page