2

I am trying to get this to compile, but having trouble with the nested class.

struct TKey {
    char a[2];
};

template<class TKEY, class TOBJ>
struct CHash {
    struct TNode {
        TKEY Key;
        TOBJ Obj;
    };
    int stuff;
};

template <class TKEY, class... ARGS>
class CNested : public CHash<TKEY, int> {
public:
    typedef CNested<ARGS...>            TNested;

    template<class TKEY1, class... ARGS1>
    struct TNodeType {
        typedef typename TNested::TNodeType<ARGS1...>::Type Type;
    };

    template<class TKEY>
    struct TNodeType<TKEY> {
        typedef TNode Type;
    };

    CNested() { }

};

// recursive template, tail
template <class TKEY, class TOBJ>
class CNested<TKEY, TOBJ> : public CHash<TKEY, TOBJ> {
public:
    CNested() { }
};


int main(int argc, char* argv[])
{
    // p should have type of CNested<TKey, TKey, int>::TNode*
    CNested<TKey, TKey, TKey, int>::TNodeType<TKey>* p; 
    return 0;
}
johnnycrash
  • 5,184
  • 5
  • 34
  • 58
  • Possible duplicate of [Where and why do I have to put the "template" and "typename" keywords?](http://stackoverflow.com/questions/610245/where-and-why-do-i-have-to-put-the-template-and-typename-keywords) – SirGuy Nov 30 '15 at 20:52

1 Answers1

3

TNodeType is a dependent template name, thus you need:

typedef typename TNested::template TNodeType<ARGS1...>::Type Type;
                          ^^^^^^^^

Also in nested struct TNodeType argument TKEY shadows argument TKEY of outer class CNested, so you would need to change to:

template<class TKEY1>
struct TNodeType<TKEY1> {
    typedef TNode Type;
};
101010
  • 41,839
  • 11
  • 94
  • 168