std :: priority_queue参数化比较结构

时间:2012-08-22 07:26:10

标签: c++ priority-queue

我第一次使用std :: priority_queue进行大学任务。分配是过程调度的模拟。我想将一个参数传递给我的Comparison结构构造函数来初始化,我以为我在另一个论坛上看到它,但我无法再找到源代码。在发布之前我查看了SO,但我没有看到任何相似内容。

这是我的priority_queue:

/* schedules.hpp / .cpp */
#include "process.hpp"

namespace my = procschedassignment;

int tick = 0;
std::priority_queue<my::Process, _
        std::vector<my::Process>,
        PrioritiseHighestResponseRatioNext(tick) > rq;
^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
line 100 - compiler errors are here
// ...

这是我的比较结构:

/* prioritise_process.hpp / .cpp */
#include "process.hpp"

namespace my = procschedassignment;

struct PrioritiseHighestResponseRatioNext {
    public:
        explicit PrioritiseHighestResponseRatioNext(int const& cpu_time)
                : cpu_time_(cpu_time) {};
        bool PrioritiseHighestResponseRatioNext::operator()(my::Process const& lhs,
                my::Process const& rhs) {
            bool ret;

            if (lhs.wait_time() > cpu_time_) {
                ret = (lhs.ResponseRatio() > rhs.ResponseRatio());
            } else if (rhs.wait_time() > cpu_time_) {
                ret = (lhs.ResponseRatio() < rhs.ResponseRatio());
            }

            return ret;
        };

    private:
        const int cpu_time_;
};

我使用此代码获得的编译器错误是:

../src/schedules.cpp:100: error: ‘time’ cannot appear in a constant-expression
../src/schedules.cpp:100: error: template argument 3 is invalid
../src/schedules.cpp:100: error: invalid type in declaration before ‘;’ token

是否可以将参数化的比较结构与std :: priority_queue一起使用? 我是STL的新手,所以我很抱歉我对这里发生的事情没有更好的了解。

1 个答案:

答案 0 :(得分:3)

您正在尝试将对象作为模板参数传递。这不行。您应该将比较器作为构造函数的参数提供,将比较器的类型作为template-argument。

// declare type
typedef std::priority_queue<my::Process,
                            std::vector<my::Process>,
                            PrioritiseHighestResponseRatioNext > process_queue;
                            // ^^^ just a type, no object ^^^
// create object
process_queue rq(PrioritiseHighestResponseRatioNext(tick));