1

大学の課題で初めて std::priority_queue を使用しています。割り当ては、プロセス スケジューリングのシミュレーションです。初期化するために比較構造体コンストラクターにパラメーターを渡したいのですが、別のフォーラムで見たと思いましたが、ソースを再度見つけることができません。投稿する前に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 を初めて使用するので、ここで何が起こっているのかをよく理解していないことをお詫びします。

4

1 に答える 1

3

オブジェクトをテンプレート パラメータとして渡そうとしています。これは機能しません。コンストラクターへの引数としてコンパレーターを提供し、テンプレート引数としてコンパレーターのタイプを提供する必要があります。

// 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));
于 2012-08-22T07:28:01.480 に答える