1

持っている:

std::map<const int, float> m_areaCost;

私は以下をコンパイルしようとしています:

inline float getAreaCost(const int i) const { 
    return m_areaCost[i]; 
}

これにより、次のエラーが発生します。

error C2678: binary '[' : no operator found which takes a left-hand operand of type 'const std::map<_Kty,_Ty>' (or there is no acceptable conversion) 

以前は、呼び出し時に[elementId]要素値またはデフォルトの要素値を取得すると考えていたので、このような単純なケースでコンパイルエラーが発生する可能性があるのではないでしょうか。

4

4 に答える 4

7

おそらくm_areaCost、のメンバーであるオブジェクトgetAreaCostのメンバーです。ただし、メンバー関数getAreaCostとしてマークされています。constこれは、メンバーに変更を加えることができないことを意味します。したがって、m_areaCostメンバーはconstこの関数に含まれます。

まだ存在しない場合は新しい要素が挿入operator[]されるため、を呼び出すことはできません。const std::map代わりに:を使用してstd::map::atください

return m_areaCost.at(i);
于 2013-03-25T12:19:27.257 に答える
1

関数がconstであり、[]がconst演算子ではないと述べているためです。自分で言ったように、[]!は新しい値を作成または返します。作成できない場合は、この演算子を使用できません。find()を使用し、.second値が存在する場合は、次のように返します。 :

auto it = m_areaCost.find(i);
if (it != m_areaCost.end()) return (*it).second
于 2013-03-25T12:19:14.197 に答える
0

メソッドをにマークしたからですconst

これを行うreturn m_areaCost[i];と、キーが存在しない場合に実際にマップにエントリを作成できます。したがって、操作は一定ではないため、定数関数とマップの非定数の間に不一致がoperator[]あります。

メンバー関数を使用するconst場合は、を使用findしてキーのエントリを検索する必要があります。

于 2013-03-25T12:20:12.117 に答える
0

その理由は、他の人が述べているように、getAreaCostとして宣言されているということですconstが、私はいくつかの提案をしたいと思います:

関数は常に有用な値を返す必要があるため、次のようにすることをお勧めgetAreaCostします。

inline float getAreaCost(int i) const { 
    std::map<const int, float>::const_iterator It = m_areaCost.find(i);

    if (It != m_areaCost.end()) return It->second;

    return 0.0f;
}

いくつかのポイント:
1。入力パラメーターは値渡しであるため、の必要はなくconst int i、を使用するだけint iです。2.冗長で
あるようなものを見つけた場合は、それにを与えます。(そうでない場合は、もちろん、書き続けてください:P) 3.は、たとえば、自分のケースに適したデフォルト値を返すことができます。std::map<const int, float>::const_iteratortypedef
0.0f

于 2013-03-29T15:58:48.277 に答える