user1492900
user1492900

Reputation: 575

Nested struct type in a template class

template <typename vec1, typename vec2>
class fakevector
{
    public:
       /* Do something */
};



template <class A>
class caller
{
    public:

    struct typeList
    {
        struct typeOne
        {
            //...
        };
    };

    typedef fakevector<typeList::typeOne,int> __methodList;  /* This will trigger compile error */

};

The error messages I got are:

  1. Error: type/value mismatch at argument 1 in template parameter list for ‘template class fakevector’

  2. Error: expected a type, got ‘caller::typeList::typeOne’

    If template is removed from the caller class, no error will be reported, like this

    class caller { public: struct typeList { .... };

I don't know the reason. Thank you very much!

Upvotes: 3

Views: 2095

Answers (3)

Prasoon Saurav
Prasoon Saurav

Reputation: 92854

Try typedef fakevector<typename typeList::typeOne,int>

The typename prefix to a name is required when the name

  • Appears in a template
  • Is qualified
  • Is not used as in a list of base class specifications or in a list of member initializers introducing a constructor definition
  • Is dependent on a template parameter
  • Furthermore, the typename prefix is not allowed unless at least the first three previous conditions hold.

    Upvotes: 1

    Nordic Mainframe
    Nordic Mainframe

    Reputation: 28737

    Looks like the compiler is in doubt what typeOne is.

    typedef fakevector<typename typeList::typeOne,int> 
    

    should compile

    Upvotes: 1

    Maxim Egorushkin
    Maxim Egorushkin

    Reputation: 136208

    Try:

     typedef fakevector<typename typeList::typeOne,int> __methodList;
    

    http://www.comeaucomputing.com/techtalk/templates/#typename

    Upvotes: 2

    Related Questions