模板参数可用于不同的STL容器吗?

时间:2018-12-26 12:51:30

标签: c++

我有一个问题,我找不到任何解决方案。我正在使用c ++ stl容器编写Java集合层次结构。我有模板类 Collection ,它是基础抽象类,而 List 类是从 Collecton ArrayList 类派生的。从List派生。

接口是:

template<typename T,template <typename...> class Container>
class collections
{
public:
    virtual gtuiterator<T,Container> iterator()=0;//my own iterator class
    virtual bool contains(T e)=0;
    virtual bool containsAll(collections& c)=0;
    //and other methods 
};

List.h与Collections.h相同

template<typename T,template <typename...> class Container>
class list : public collections<T,Container>
{
public:
    virtual gtuiterator<T,Container> iterator()=0;
    virtual bool contains(T e)=0;
    virtual bool containsAll(collections<T,Container>& c)=0;        
};

和ArrayList.h

template<typename T,template <typename...> class Container>
class ArrayList : public list<T,Container>
{
public:
    virtual gtuiterator<T,Container> iterator()override{
        gtuiterator<T,Container> iter(&array);
        return iter;
    }
public:
    ...
};

然后我主要调用containsAll方法:

ArrayList<int,std::list> test1;
for (int i = 0; i < 5; i++)
    test1.add(i);

ArrayList<int,std::vector> test2;
for (int i = 0; i < 5; ++i)
    test2.add(i);

cout << "TESTED =" << test1.containsAll(test2) << endl;

编译器说bla bla没有转换。

        error: no matching function for call to ‘collectionsgtu::ArrayList<int, std::__cxx11::list>::containsAll(collectionsgtu::ArrayList<int, std::vector>&)’
      cout << "TESTED =" << test1.containsAll(test2) << endl;
                                                   ^
    In file included from test.cpp:2:0:
    arraylist.h:34:16: note: candidate: bool collectionsgtu::ArrayList<T, Container>::containsAll(collectionsgtu::collections<T, Container>&) [with T = int; Container = std::__cxx11::list]
       virtual bool containsAll(collections<T,Container>& c)override{
arraylist.h:34:16: note:   no known conversion for argument 1 from ‘collectionsgtu::ArrayList<int, std::vector>’ to ‘collectionsgtu::collections<int, std::__cxx11::list>&’

我知道错误的原因,例如,当我声明test2<int,std::vector>,时,编译器将std :: vector乘以T,因此containsAll函数参数成为std :: vector参数,并且不接受其他stl容器。 如果test1和test2的第二个参数相同,则代码起作用。

我怎么能模板化这些可以接受一些stl容器(集合,列表,向量)的类,这些类的函数参数如containAll?

谢谢。

1 个答案:

答案 0 :(得分:1)

您可以将containsAll用作模板函数:

template<typename C>
bool containsAll(collection<T, C> const&);

由于模板成员函数不能为virtual,因此您必须在collection类中实现它,但是可以实现它来调用一些protected虚拟功能。