0

コードでは次のようになります。

比較アルゴリズム

class PathComp{
public:
virtual bool betterThan(const PathInfo& path1, const PathInfo& path2) const{
//returns true if path1 is shorther than path2
{
};

再定義された演算子 () を持つクラス

class QueueComp{
private:
PathComp* comp;
public:
QueueComp(PathComp* pc);
bool operator () (const pair<PathInfo, string>& item1, const pair<PathInfo, string> item2);
};

QueueComp::QueueComp(PathComp* pc):comp(pc){}
bool QueueComp::operator () (const pair<PathInfo, string>& item1, const pair<PathInfo, string>& item2){
    return comp->betterThan(item1.first, item2.first);
}

プライオリティ キューを使用する関数

list<string> Graph::shortestPath(const string& from, const string& to, PathComp* pc) const{
    const QueueComp comp(pc);
    std::priority_queue<pair<PathInfo, string>, set<pair<PathInfo, string> >, comp> q;
}

コンパイラにエラー メッセージが表示されます。'comp' は定数式に表示できません。テンプレート引数 3 が無効です。前の宣言の型が無効です。トークン

どこに問題があるか知っている人はいますか?助けてくれてありがとう。

4

1 に答える 1

1

コンパイラは、問題が何であるかをすでに述べています。非 -constexprはテンプレート引数にすることはできません。あなたはおそらく書くつもりだった

std::priority_queue<std::pair<PathInfo, std::string>,
                    std::vector<std::pair<PathInfo, std::string> >,
                    QueueComp>
    q(comp);

当面の問題は、それcompがオブジェクトであるということでしたが、テンプレートは比較関数の型を想定しています。これが修正されると、次の問題は、std::set<...>使用できる実行可能なコンテナーではなく、使用できるstd::priorit_queue<...>ということstd::vector<...>です。

于 2012-11-25T21:16:59.743 に答える