johnnycrash
johnnycrash

Reputation: 5344

Variable length argument template class with nested class

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

Upvotes: 2

Views: 46

Answers (1)

Dimitrios Bouzas
Dimitrios Bouzas

Reputation: 42929

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

Upvotes: 3

Related Questions