boost :: bind with maps,绑定std :: pair和std :: map :: value_type之间的区别是什么?

时间:2012-02-26 16:55:50

标签: c++ boost stl boost-bind

以下两种情况有什么区别?

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.hvalue_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 个答案:

答案 0 :(得分:2)

不同之处在于在地图值类型中使用conststd::pair<int,std::string>::first上的std::pair<const int,std::string>::first不是可访问的项目。是的,从const版本到非const版本的对都定义了隐式转换,但是为了调用这样的成员函数,不考虑该转换。 pair的这些用法可能看起来很相似,但实际上它们是完全独立的类,它们在字段位置等方面彼此无关。

从本质上讲,你要求使用boost来构建像

这样的代码
std::pair<const int,std::string> example(3, "Hello");
example.std::pair<int,std::string>::first

无效。

答案 1 :(得分:1)

map的{​​{1}} value_type密钥(在您的情况下为const),而您使用的对则不是const int在你的情况下)。