为什么这个std::绑定失败

why this std::bind fails?

本文关键字:绑定 失败 std 为什么      更新时间:2023-10-16

此绑定操作与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)。这是一个样品。

#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;
    }
}

正如chris所说:

首先,成员函数不会衰减为成员函数指针。另一方面,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,作为映射擦除成员函数的密钥传递。