context.cpp:35: error: passing
'const std::map<
std::basic_string<char, std::char_traits<char>, std::allocator<char> >,
float,
std::less<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >,
std::allocator<std::pair<
const std::basic_string<char, std::char_traits<char>, std::allocator<char> >,
float> > >'
as 'this' argument of
'_Tp& std::map<_Key, _Tp, _Compare, _Alloc>::operator[](const _Key&)
with
_Key = std::basic_string<char, std::char_traits<char>, std::allocator<char> >,
_Tp = float,
_Compare = std::less<std::basic_string<char, std::char_traits<char>, td::allocator<char> > >,
_Alloc = std::allocator<std::pair<
const std::basic_string<char, std::char_traits<char>, std::allocator<char> >,
float> >'
discards qualifiers
std::basic_string
は を実装するために使用されるテンプレートstd::string
であり、実際にstd::string
は単に に基づくインスタンス化ですchar
。したがって、最初に次のように置き換えます。
context.cpp:35: error: passing
'const std::map<
std::string,
float,
std::less<std::string>,
std::allocator<std::pair<const std::string, float> >
>'
as 'this' argument of
'_Tp& std::map<_Key, _Tp, _Compare, _Alloc>::operator[](const _Key&)
with
_Key = std::string,
_Tp = float,
_Compare = std::less<std::string>,
_Alloc = std::allocator<std::pair<const std::string> >'
discards qualifiers
_Compare
デフォルトを使用しているだけなので、マップの(比較関数) および_Alloc
(アロケータ) 引数についてはあまり気にしません。_Key
これらは無視して、との_Tp
値をテンプレートの説明に代入しましょう。
context.cpp:35: error: passing
'const std::map<std::string, float>'
as 'this' argument of
'float& std::map<std::string, float>::operator[](const std::string&)
discards qualifiers
では、もっと簡単に説明しましょう。の を使用していてoperator[]
、std::map<std::string, float>
それを で使用しようとしていますconst std::map<std::string, float>
(つまり、this
呼び出しの引数として使用しているものです)。これは「修飾子を破棄」します。具体的には、const
修飾子です。
コンパイラはoperator[]
、マップの がマップを保持することを約束しないconst
、つまり、マップを変更することが許可されていることを伝えています。これはコンパイル エラーです。マップが変更されないという組み込みアサーションを使用してコードが記述されているためです。
なぜマップが変わるのですか?さて、ドキュメントを見てください:
x がコンテナー内の要素のキーと一致する場合、関数はマップされた値への参照を返します。
x がコンテナー内のどの要素のキーとも一致しない場合、関数はそのキーを持つ新しい要素を挿入し、マップされた値への参照を返します。これにより、マップされた値が要素に割り当てられていない場合でも、常にマップ サイズが 1 増加することに注意してください (要素は既定のコンストラクタを使用して構築されます)。
(強調鉱山)。
要素の挿入は確かに変更です。
なぜこれを行うのですか?それについては、すでに質問があります。