3

operator[]新しいC++unordered_mapに問題があります。キーでを使用したいのですがconst、拒否されます。

コード全体を提供することはできませんが、次のように問題を単純化することはできます。

#include <unordered_map>

class A {
    public:
        A();
};

class B {
    public:
        B();
};

int main(int argc, char **argv) {
    std::unordered_map<A &, B> myMap;
    A a;
    const A &ar = a;
    B b;
    myMap[ar] = b;
}

コンパイラの出力は少し長いですが、次で終わります。

/usr/include/c++/4.6/bits/hashtable_policy.h:537:5: note:   no known conversion for argument 1 from ‘const A’ to ‘A&’

const A &私のコードでは、いくつかのメソッドがそれをそのまま私に与えるので、私はを使用します。そして、ちなみに、キーはconstである必要があります。代わりに試しましたstd::unordered_map<const A &, B> myMap;が、どちらも機能しません。

フラグ付きのgccバージョン4.6.3(Ubuntu / Linaro 4.6.3-1ubuntu5)を使用してい-std=c++0xます。

なぜ禁止されているのか教えてください。私はその理由がわからないと言わなければなりません。

どうもありがとう(そして質問がばかげているなら失礼します...)。

4

2 に答える 2

4

その理由はoperator[]次のように指定されているためです(同じことがちょうどに当てはまることに注意してくださいstd::map):

Value& operator[](Key const& k);

あなたの場合、KeyA&、なので、これは次のように展開されます。

B& operator[](A& const& k);

また、参照への参照は無効であり、typedefまたはテンプレートパラメーターを使用して作成すると最上位の参照が削除されるため、次のようになります。

B& operator[](A&);

A const&引数を処理できません。

一般に、可変キーはエラーの良い原因であるため、キーとして可変参照を使用しないことをお勧めします。

于 2012-11-04T20:24:42.337 に答える
0

参照をキーとして使用することは悪い考えです。マップとキーの存続期間が調整されていないため、問題が発生する可能性があります。参照マップの主要なタイプは次のとおりですT&const最後に追加がありますが、違法です)。をにバインドしようとしても機能T const&T&ません。T const&したがって、キーとして使用してマップを検索するために使用することはできませんT&

動作しないものは他にもあります。T&キーが(またはそれに関しては)のマップを使用しようとしないでくださいT*。値をキーとして使用してください。

于 2012-11-04T20:21:35.947 に答える