2012-02-26 8 views
2

次の2つのケースの違いは何ですか?boost :: bindをマップで使用すると、std :: pairとstd :: map :: value_typeのバインディングはどうなりますか?

std::pair<int,std::string> example_1 (std::make_pair (1,"foo")); 
int value_1 = boost::bind (&std::pair<int,std::string>::first,_1) (example_1); 

std::map<int,std::string>::value_type example_2 (std::make_pair (2,"boo")); 
int value_2 = boost::bind (&std::pair<int,std::string>::first,_1) (example_2); 

最初の例はうまくいきますが、2番目の例はバインディングが完了してもコンパイルされません。

typedef std::pair<const _Key, _Tp> value_type; 

私は違いが表示されていない:私は次のように定義されたファイルstl_map.hを見てvalue_typeています。誰かが私に知らせることができ、2番目の例がコンパイルされない理由を伝えることができて感謝します。

コンパイルエラーメッセージは次のとおりです。事前に

.../include/boost/bind/mem_fn.hpp:333:36: error: no matching function for call to ‘get_pointer(const std::pair<const int, std::basic_string<char> >&)’ 
make: *** [main.o] Error 1 

ありがとう!

答えて

1

mapvalue_typeあなたが使用しているペアは(あなたのケースでint無地)ないのに対し、constキー(あなたのケースでconst int)を持っています。

+0

そうですよ!私は 'const'を理解しませんでした Gracias! – user1192525

2

違いはマップ値タイプでconstの使用です。 std::pair<int,std::string>::firststd::pair<const int,std::string>::firstのアクセシブルなアイテムではありません。はい、constバージョンから非constバージョンへのペアで定義された暗黙の変換がありますが、そのような変換は、このようなメンバ関数を呼び出すためには考慮されません。 pairのそれらの使用は類似しているかもしれませんが、実際にはフィールドの場所などがどこにあるのかという点では互いに無関係な完全に独立したクラスです。本質的には

は、you'eは有効ではありません

std::pair<const int,std::string> example(3, "Hello"); 
example.std::pair<int,std::string>::first 

のようなコードをビルドするためにブーストを尋ねました。

+0

うん、私は 'const'を実現しなかった...もっとコーヒーを飲む。ありがとう! – user1192525

関連する問題