1

我对从模板派生不是很熟悉,请参见以下内容:

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似乎从未被调用过。当我置顶/弹出元素时,它们并不像我期望的那样按(分数的)顺序排列。

所以这可能更像是一个语法/使用问题,请多多包涵,但我找不到任何答案来解决这个问题。我虽然通过定义模板参数都可以解决。我在这里缺少什么?

谢谢您的帮助!

4

1 回答 1

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> {

警告:有些人——根据经验——会告诉你永远不要从标准库容器类派生。 (阅读原因)

为了给您一些余地,我只会警告您不要向您的类添加显式析构函数或添加具有非平凡析构函数的成员变量。由于您唯一的成员是unsigned int,因此显示的代码不会有问题。

于 2013-04-23T15:09:00.220 回答