使用visual studio 2013进行错误C3867的绑定操作有什么问题?
#include <map>
#include <vector>
#include <algorithm>
#include <functional>
int main()
{
std::map<int, int> m1, m2;
std::vector<std::map<int, int> *> pM;
std::for_each(pM.begin(), pM.end(),
std::bind(std::map<int, int>::erase , 1));
}
答案 0 :(得分:0)
如果要在向量中删除每个地图的元素(哪个键为1)。这是一个样本。
#include <map>
#include <vector>
#include <algorithm>
#include <functional>
#include <iostream>
using namespace std;
using namespace std::placeholders;
int main()
{
std::map<int, int> m1 {{1,2},{2,3},{3,4}}, m2 {{2,3},{1,5},{8,9}};
std::vector<std::map<int, int> *> pM {&m1,&m2};
size_t(std::map<int,int>::*pf)(const int& key)=&std::map<int,int>::erase;//note this line.
std::for_each(pM.begin(), pM.end(),std::bind(pf,_1,1));//note this line
for(auto& ele:m1)
{
cout<<ele.first<<","<<ele.second<<endl;
}
for(auto& ele:m2)
{
cout<<ele.first<<","<<ele.second<<endl;
}
}
正如克里斯所说:
首先,成员函数不会衰减为成员函数 指针。另一方面,std :: map :: erase被重载。
我们必须使用&
来获取成员函数指针,并且必须告诉编译器您要选择哪个重载函数。
所以写这样的代码:
size_t(std::map<int,int>::*pf)(const int& key)=&std::map<int,int>::erase;
进一步:
std::bind(pf,_1,1)
成员函数需要对象作为其隐式的第一个参数,_1
执行此操作。最后一个参数1
是int作为映射擦除成员函数的键传递。