为什么这个std :: bind失败了?

时间:2015-03-26 03:54:30

标签: c++ c++11 stl

使用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));
}

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作为映射擦除成员函数的键传递。