std::bind を使用すると、VS2010 では、オブジェクト自体ではなくポインターまたはイテレーターを渡すことで、データ メンバーをバインドできました。ただし、VS2012 では動作しないようです。
#include <vector>
#include <utility>
#include <iostream>
#include <functional>
using namespace std;
int main()
{
vector<pair<string, int>> v;
v.push_back(make_pair("abc", 10));
auto f = bind(&pair<string, int>::second, v.begin());
int res = f();
cout << res << endl;
return 0;
}
GCC もこのコードを正常にコンパイルして実行しますが、VS2012 ではエラーが発生します。
error C2440: 'initializing' : cannot convert from 'std::_Do_call_ret<_Forced,_Ret,_Funx,_Btuple,_Ftuple>::type' to 'int'
1> with
1> [
1> _Forced=false,
1> _Ret=void,
1> _Funx=std::_Pmd_wrap<int std::pair<std::string,int>::* ,int,std::pair<std::string,int>>,
1> _Btuple=std::tuple<std::_Vector_iterator<std::_Vector_val<std::_Simple_types<std::pair<std::string,int>>>>>,
1> _Ftuple=std::tuple<>
1> ]
1> Expressions of type void cannot be converted to other types
イテレータまたはポインタの代わりに std::pair インスタンスを渡すと、VS2012 は満足することに注意してください。
ここで何が問題なのですか?