boost :: bind with maps, в чем разница между связыванием std :: pair и std :: map :: value_type? - PullRequest
2 голосов
/ 26 февраля 2012

В чем разница между следующими двумя случаями?

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);

Первый пример работает нормально, но второй не компилируется, когда привязка завершена.Я посмотрел на файл stl_map.h и value_type определяется следующим образом:

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

Я не вижу разницы.Буду признателен, если кто-нибудь подскажет, дайте мне знать, и причина, по которой второй пример не компилируется.

Сообщение об ошибке компиляции:

.../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

Заранее спасибо!

Ответы [ 2 ]

2 голосов
/ 26 февраля 2012

Разница заключается в использовании const в типе значения карты. std::pair<int,std::string>::first не доступен для std::pair<const int,std::string>::first. Да, существует неявное преобразование, определенное парой из константной версии в неконстантную версию, но это преобразование не рассматривается для целей вызова функции-члена, подобной этой. Эти варианты использования pair могут выглядеть похожими, но на самом деле они являются полностью независимыми классами, которые не связаны друг с другом с точки зрения того, где могут располагаться поля и т.п.

По сути, вы попросили boost для создания кода, подобного

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

, что недействительно.

1 голос
/ 26 февраля 2012

map s value_type имеет клавишу const (const int в вашем случае), тогда как у пары, которую вы используете, нет (обычная int в вашем случае).

...