2

重複の可能性:
STL マップの [] 演算子が const でないのはなぜですか?

これを(私が思うに)最も単純な形式に要約しました。

#include <iostream>
#include <map>
#include <vector>

class NumberHolder
{   
public:
    NumberHolder( const std::string aKey, const double aNumber );
    void printSmallestMappedNumber( const unsigned int theIndex ) const;
private:
    std::vector< std::map< std::string, double> > theNamedNumberMapVector;
};

NumberHolder::NumberHolder( const std::string key, const double aNumber )
{
    std::map<std::string, double> aTempMap;
    aTempMap[key] = aNumber;
    theNamedNumberMapVector.push_back(aTempMap);
}

void NumberHolder::printSmallestMappedNumber( const unsigned int theIndex ) const
{
    std::map<std::string, double>& aSpecificMap = theNamedNumberMapVector[theIndex];
    std::cout << aSpecificMap["min"] << std::endl;
}

int main(int argc, char* argv[])
{
    NumberHolder aTaggedNumberHolder("min", 13);
    aTaggedNumberHolder.printSmallestMappedNumber( 0 );
    return 0;
}

マップでいっぱいのベクトルがあり、各マップは(文字列)「タグ付き」番号でいっぱいです。関連する変数の可視性/可変性へのアクセスを厳密に制御しようとしています。

とにかく、コンパイラはこのエラーで失敗します

タイプ 'std::map' への参照をタイプ 'const std::map, double, std::less >, std::allocator, double> > >' の値にバインドすると修飾子が削除される

私の最初の(不十分な)試みは、マップをconstにすることでした...、マップを変更していないため、マップから値を取得するだけです:

const std::map<std::string, double>& aSpecificMap = theNamedNumberMapVector[theIndex];

次に、この確かに短いが、実際にはもう少し紛らわしいエラーが表示されます。

No viable overloaded operator[] for type 'const std::map<std::string, double>'

代わりに次の行で:

 std::cout << aSpecificMap["min"] << std::endl;

しかし、おそらく私はこれを少し解き明かそうとしてきたので、私の解決策はひどく、ひどく無愛想なようです:

std::map<std::string, double>& aSpecificMap = const_cast<std::map<std::string, double>&>(theNamedNumberMapVector[theIndex]);

[const derp] 修飾子を const_casting することで問題を回避できますが、何が起こっているのかを正確に理解したいと思っています。コンパイラは、マップへのアクセスに不満を持っており (上記の 2 回目の試行で)、マップのコンテンツへのアクセスを使用および悪用すると考えています。私はこのようなことを他の人に説明したい/説明できる必要がある.

4

2 に答える 2

5

マップのoperator[]の宣言を見ると、修飾されていないことがわかります。constこれが、 a で呼び出すことができない理由const std::map<std::string, double>です。const ではない理由は、キーがマップに存在しない場合に作成されるためです。代わりにfindoratを使用して要素を取得する必要があります。

于 2012-05-28T02:55:01.370 に答える
0

map<>::operator[]要素がまだ存在しない場合は、マップに要素を作成します。これが、constオブジェクトで許可されていない理由です。を使用する必要がありますfind()

(右にリンクされた質問のいくつかはすでにこれに答えています:例えば、[] operator const for STL maps? - 私はこれを重複として閉じることに投票します)

于 2012-05-28T02:53:37.483 に答える