c++ - 模板参数适用于不同的 STL 容器?

标签 c++

我有一个问题,但找不到任何解决方案。我正在使用 c++ STL 容器编写 Java 集合层次结构。我有模板类 Collection ,它是基本抽象类和 List 类,它派生自 CollectionArrayList 类派生自列表。

接口(interface)是:

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>, 时编译器通过 T 放置 std::vector,因此 containsAll 函数参数成为 std::vector 参数并且不接受其他 STL 容器。 如果 test1 和 test2 的第二个参数相同,则代码有效。

我如何为这些接受一些 STL 容器(集、列表、 vector )的类模板化函数参数,如 containAll ?

谢谢。

最佳答案

您可以使 containsAll 成为模板函数:

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

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

关于c++ - 模板参数适用于不同的 STL 容器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53932370/

相关文章:

C++ NetBeans 错误 : expected unqualified-id before 'int'

php - 如何使用 libcurl 从用 C++ 编写的游戏发布到我服务器上的 php 页面更安全?

c++ - 如何使用重载运算符修复此内存泄漏?

c++ - 使用模板函数传递模板参数时出错

c++ - vb.net 将数组传递给 C++ 导致堆栈错误

c++ - 检查winapi函数是否可用

c++ - 有没有办法在 C++ 中静态初始化动态分配的数组?

c++ - 有没有办法像系统 ("pause"那样暂停)?

C++:如何将字符串转换为起始字符可以更改的 float ?

c++ - 如何检索轮廓点 - 使用 opencv 转换为 vector ?