【发布时间】: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<double>' to 'std::list<double, std::allocator<double>>' 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