【问题标题】:Sorting a subclass of STL list对 STL 列表的子类进行排序
【发布时间】:2014-06-29 07:44:41
【问题描述】:

考虑我创建的一个名为myList 的模板类,它基本上扩展了C++ STL 中提供的std::list 对象。我已经覆盖了一些函数,例如size()front()back(),但没有触及std::list 提供的sort() 函数。

基本上,我希望能够对myList 进行排序,考虑我的装饰器实现:

#import "myList.h"

template <typename T>
class myListDecorator : public myList<T> {

public:
    myListDecorator() : m_list(myList<T>()){}

    myListDecorator(const myList<T> &my_list) {
        m_list = my_list.sort();
    }

private:
    myList<T> m_list;

};

每当我创建myList(在这种情况下使用double 类型的对象)时,我都会收到以下错误:

Candidate function not viable: no known conversion from 'const myList&lt;double&gt;' to 'std::list&lt;double, std::allocator&lt;double&gt;&gt;' for object argument

我是否必须重写 myList 中的 sort() 函数并实现我自己的排序才能使其工作?

编辑:

一些 cmets 指出在这个类中有两个 myList 对象是多么令人困惑。我已经更新了我的代码,使其更加“正确”/“最佳实践”。它现在完成了我想要做的事情并且更加整洁:

#include "myList.h"

template <typename T>
class myListDecorator : public myList<T> {

public:
    myListDecorator() : myList<T>(myList<T>()){}

    myListDecorator(const myList<T> &my_list) : myList<T>(my_list){
        this->sort();
    }
};

【问题讨论】:

  • 公开继承标准容器被认为是不好的做法。
  • 你为什么公开继承std::list而不是让std::list成为myListDecorator的成员?
  • 确实,好问题。如果您从myList 继承并且还有一个myList 成员,那么您在myListDecorator 中有两个 列表。这会令人困惑。
  • 感谢您提出这个问题 - 当然!我会用一些更正确的新代码来更新我的问题。虽然我最终没有使用您的答案@GregHewgill,但我会接受,因为它确实回答了原始问题!

标签: c++ list sorting c++11 stl


【解决方案1】:

您的my_listconstsort() 成员函数在原地修改列表,并且不能对常量列表执行此操作。 (注意sort()的返回类型是void。)

你应该能够:

myListDecorator(const myList<T> &my_list): m_list(my_list) {
    m_list.sort();
}

【讨论】:

    【解决方案2】:

    原因是您试图将 const myList 强制转换为非常量类型。 顺便说一句,“#import”不是标准的 C/C++ 预处理器语句。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-01-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多