【问题标题】:A template parameter works with different STL containers?模板参数适用于不同的 STL 容器?
【发布时间】:2019-05-24 17:38:15
【问题描述】:

我有一个问题,我找不到任何解决方案。我正在使用 c++ stl 容器编写 Java 集合层次结构。我有模板类 Collection 这是基础抽象类和 List 类派生自 ColletonArrayList 类派生自 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&lt;int,std::vector&gt;, Compiler 将std::vector 放在T 时,所以containsAll 函数参数变成了std::vector 参数并且不接受其他stl 容器。 如果 test1 和 test2 的第二个参数相同,则代码有效。

我如何模板化这些类,这些类接受一些 stl 容器(set,list,vector)作为函数参数,如 containsAll ?

谢谢。

【问题讨论】:

  • 在当前的设计中,你不能,因为你需要虚拟模板成员函数,这是不允许的。有关更多信息,请参阅此答案:stackoverflow.com/q/7968023

标签: c++


【解决方案1】:

您可以将containsAll 设为模板函数:

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

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

【讨论】:

  • 我听不懂你。请举例说明,我如何在 Collection 接口中实现此方法,它没有成员?谢谢。
  • @G.Akin 您可以遍历作为参数传递的集合,然后为每个元素调用 contains 函数。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-04
相关资源
最近更新 更多