これを(私が思うに)最も単純な形式に要約しました。
#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 回目の試行で)、マップのコンテンツへのアクセスを使用および悪用すると考えています。私はこのようなことを他の人に説明したい/説明できる必要がある.