我不熟悉从模板派生,请参阅以下内容:
class BCQueue_;
template<typename T,
typename Sequence = std::vector<T>,
typename Compare = std::less<typename Sequence::value_type> >
class FixedPriorityQueue : public std::priority_queue<T> {
friend class BCQueue_; // to access private member maxSize_
public:
FixedPriorityQueue(unsigned int maxSize)
: maxSize_(maxSize) {}
// smallest item will be dropped if queue id full
void insertWithOverflow(const T& x) {
// ...
this->push(x);
// ...
}
private:
FixedPriorityQueue() {}
const unsigned int maxSize_;
};
class ScoreLessThan : public std::binary_function<CCandidate *, CCandidate *, bool> {
public:
bool operator()(
const CCandidate * a, const CCandidate * b) const {
std::wcout << a->score << " < " << b->score << std::endl;
return a->score > b->score;
}
};
class BCQueue_ : public FixedPriorityQueue<
CCandidate *, std::vector<CCandidate *>, ScoreLessThan> {
public:
BCQueue_(size_t maxSize)
: FixedPriorityQueue(maxSize) {}
bool willInsert(float score) {
return size() < maxSize_ || top()->score < score;
}
};
BSQueue bc(20);
bs.insertWithOverflow(new CCandidate( ... ));
// ...
在FixedPriorityQueue中,我有一个名为insertWithOverflow
的方法,它通过删除最小元素来插入元素(如果队列已满)。
为了使事情稍微分开,我从FixedPriorityQueue派生。基本上所有工作都很好,除了似乎永远不会调用比较器ScoreLessThan
。当我顶部/弹出元素时,它们不符合我所期望的顺序(分数)。
因此,这可能更多是语法/使用问题,请耐心等待,但我找不到任何答案来解决问题。我通过定义模板参数可以解决所有问题。我在这里缺少什么?
感谢您的帮助!
答案 0 :(得分:1)
这是问题所在。
template<typename T,
typename Sequence = std::vector<T>,
typename Compare = std::less<typename Sequence::value_type> >
class FixedPriorityQueue : public std::priority_queue<T> {
// Wrong base class ^^^^^^^^^^^^^^^^^^^^^^
任何FixedPriorityQueue<A,B,C>
都来自std::priority_queue<A,(default),(default)>
更改它以使基类使用相同的模板参数。
template<typename T,
typename Sequence = std::vector<T>,
typename Compare = std::less<typename Sequence::value_type> >
class FixedPriorityQueue : public std::priority_queue<T,Sequence,Compare> {
警告:有些人 - 根据经验明智 - 会告诉您从不从标准库容器类派生。 (Read why)
为了给你一些回旋余地,我只会警告你不要在你的班级中添加一个明确的析构函数,或者添加具有非平凡析构函数的成员变量 。由于您的唯一成员是unsigned int
,因此显示的代码不会出现问题。