如何正确编写模板模板参数?

时间:2014-05-15 06:26:34

标签: c++ templates collections adapter

我正在尝试使用模板为任何C ++集合创建一个适配器。

我需要使用模板模板参数,所以我可以使用适配器:

CollectionAdapter<std::vector<int>> a;

并不喜欢:

CollectionAdapter<std::vector<int>,int> a;

一次需要两个模板参数。

我写了这堂课:

template <
    template <class U> class T
>
class CollectionAdapter {

public:
    typedef T<U> ThisCol;
    typedef void iterator;

    CollectionAdapter() {}

    bool add(ThisCol& c,const U& i);
    bool remove(ThisCol& c,const U& i);
    U& getByIndex(int i);
    ThisCol instantiate();
    iterator getIterator(ThisCol& c);

};

然而,visual studio编译器抛出了这个错误:

error C2065: 'U' : undeclared identifier

对于这一行:

typedef T<U> ThisCol;

我做错了什么?

1 个答案:

答案 0 :(得分:2)

我认为您不需要模板模板参数。您可以简化代码:

template <class T>
class CollectionAdapter 
{

public:
    typedef T ThisCol;
    typedef typename T::value_type value_type;

    //typedef void iterator; // what?? did you mean void*?
    typedef void* void_iterator; // but not sure what the use of this is.

    // you might need the container's iterator types too
    typedef typename T::iterator iterator
    typedef typename T::const_iterator const_iterator


    CollectionAdapter() {}

    bool add(T& c,const value_type& i);
    bool remove(T& c,const value_type& i);
    value_type& getByIndex(int i);
    const value_type& getByIndex(int i) const;
    ThisCol instantiate();
    iterator getIterator(T& c);

};