具有嵌套 class 的可变长度参数模板 class

Variable length argument template class with nested class

我正在尝试编译它,但在嵌套 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;
}

TNodeType是依赖模板名,因此需要:

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

也在嵌套结构 TNodeType 参数 TKEY 中隐藏了外部 class CNested 的参数 TKEY,因此您需要更改为:

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