2016-12-08 17 views
-1

私はキーとしてカスタムオブジェクトへのポインタを使用する順序のないマップを持っています。 何らかの理由で、キーで値を参照することは、キーがconstでない場合にのみ機能します。ここで無秩序なマップ - constキーで値を取得

は(スタンドインカスタムオブジェクト用としてstd::stringで)の例である:

std::unordered_map<std::string*, int> my_map; 

std::string key {"test"}; 
const std::string const_key {"test2"}; 

auto value = my_map.at(&key); // this works as expected 
auto other_value = my_map.at(&const_key); // this doesn't compile 


error: invalid conversion from 'const string* {aka const std::__cxx11::basic_string<char>*}' 
to 'std::unordered_map<std::__cxx11::basic_string<char>*, int>::key_type 
{aka std::__cxx11::basic_string<char>*}' [-fpermissive] 

はなぜルックアップが非constのようにポインタを必要とするでしょうか?

+0

'std :: unordered_map(const std :: string *、int> my_map;'? –

+0

)を使用するとうまくいきますが、私のユースケースではキーにアクセスすることはできません。 – BoshWash

+2

それはあなたがあなたのマップを宣言した方法なのですか? –

答えて

4

&const_keyと書くと、const std::string *と評価されますが、マップではキータイプとしてstd::string *が使用されます。

「文字列へのアドレス」と「文字列へのアドレス」の間に違いがあります。したがって、これらは異なるタイプと見なされ、それらを同じ意味で使用することはできません。

P.S.これをコメントとして書くことはできませんでした。答えとして投稿されました。

+0

マップが '.at const std :: string *) 'overload?私は、ポインタとconstポインタが等しいかどうかを比較できると仮定しました – BoshWash

+0

1)' std :: unordered_map 'あなたは言っている:"私は、変更可能な文字列と値の整数としてキーアドレスを持つハッシュマップが必要です。 "なぜ、キーとして変更できない文字列にアドレスを使用できる方法が必要なのでしょうか? 2)はい、 'string *'と 'const string *'を比較することができますが、2つの 'const string *'を比較することができ、 'string *'は 'const string *'に暗黙的に変換できます。しかし、 'const string *'は変換を強制的に 'const_cast'を使用したい場合、' string * 'に暗黙的に変換可能ではありません。 –

-1

マップは、あなたがタイプstd::string *の種類const std::string *からの暗黙的な変換はありませんconst std::string *

auto other_value = my_map.at(&const_key); 
          ^^^^^^^^^^ 

タイプのキーとメソッドatを呼び出すためにツルーイングされ

std::unordered_map<std::string*, int> my_map; 
        ^^^^^^^^^^^^ 

のように宣言されています。

あなたが例えば

std::unordered_map<const std::string *, int> my_map; 

のようなマップを宣言することができ、この場合、両方の引数std::string *const std::string *を使用することができます。

関連する問題