0

次のコードは機能せず、次のエラーが発生します。

タイプ 'const comparer' のオブジェクトへの呼び出しに一致する関数がありません

タイプ 'value_compare' (別名 'std::_ 1:: _map_value_compare, int, comparer, true>') のオブジェクトへの呼び出しがあいまいです

コードは次のとおりです。

struct comparer
{
    bool operator()(const std::string x, const std::string y)
    {
        return x.compare(y)<0;
    }
};


int main(int argc, char **argv)
{
    vector< map<string,int,comparer> > valMapVect;
    map<string,int,comparer> valMap;

    valMapVect.push_back(valMap);

}

Xcode 5.x (Mac など) でコンパイルされています。

誰かが何が間違っているのか考えていますか? Linuxでコンパイルしていたときは、少し前に動作していたと思います。出来ますか?

4

1 に答える 1

2

libc ++は、関数呼び出し演算子をメンバー関数にcomparerすることを望んでいるようです:const

struct comparer
{
    bool operator()(const std::string x, const std::string y) const
    {                                                      // ^^^^^ fixes the problem
        return x.compare(y)<0;
    }
};

個人的には引数をstd::string const&( に注意してください&) として渡しますが、libc++ が比較オブジェクトを好むかどうかは変わりません。標準が存在することを義務付けているかどうかはまだわかりませんconst。比較関数をメンバーとして保持する必要があることを意味するような要件を見つけられませんでしたmutable。しかし、ステートレスであることが多いため、そこから派生してメモリを無駄にしないようにする (つまり、空の基本最適化を利用する) ことが望ましく、これはおそらく libc++ が行っていることです。かどうかははっきりしない

  • これは libc++ のバグです。つまり、比較関数オブジェクトをmutableメンバーとして格納する必要があります。
  • 標準では、関数呼び出し演算子を にすることを義務付けていませんconst
  • それを使用して関数呼び出し operator を作成するコード内const

ただし、最も簡単な修正は、関​​数呼び出し operator を作成することconstです。

于 2013-11-02T22:35:12.277 に答える