std :: function指针错误:无法将&A :: a转换为std :: function <> &&

时间:2019-11-26 03:13:12

标签: c++ function-pointers

我正在尝试将字符串映射到函数指针,以便可以使用iter->second(arg)而不是if-else来调用函数。 我写了一个简单的没有class的代码,它按预期工作。 但是当我按如下所示修改它时,它会显示编译错误。

 #include <functional>
 #include <iostream>
 #include <unordered_map>
 #include <string>

 using std::string;

 class A{
     private:
     int a(int num, string s) { return s.size() + num; }
     int b(int num, string s) { return num - s.size(); }

     public:
     void ido(string str){
         typedef std::function<int(int, string)> process_func;
         std::unordered_map<string, process_func> m;
         m.insert(std::make_pair<string, process_func>("a", &A::a));
         // using std::placeholders::_1;
         // m.insert(std::make_pair<string, process_func>("a", std::bind(&A::a, this, _1)));
         // m["a"] = std::bind(&A::a, this, _1);
         // m.insert({{"a", &A::a}, {"b", &A::b}});

         auto x = m.find(str);
         if(x == m.end()) {
             std::cout << "Not supported!" << std::endl;
         }
         std::cout << x->second(10, "hello") << std::endl;
     }
 };
 int main(int argc, char* argv[]) {
     A a;
     a.ido(string(argv[1]));
     return 0;
 }

错误是:

function.cc: In member function ‘void A::ido(std::string)’:
function.cc:17:65: error: no matching function for call to ‘make_pair(const char [2], int (A::*)(int, std::string))’
         m.insert(std::make_pair<string, process_func>("a", &A::a));
                                                                 ^
function.cc:17:65: note: candidate is:
In file included from /usr/include/c++/4.8.2/utility:70:0,
                 from /usr/include/c++/4.8.2/tuple:38,
                 from /usr/include/c++/4.8.2/functional:55,
                 from function.cc:1:
/usr/include/c++/4.8.2/bits/stl_pair.h:276:5: note: template<class _T1, class _T2> constexpr std::pair<typename std::__decay_and_strip<_Tp>::__type, typename std::__decay_and_strip<_T2>::__type> std::make_pair(_T1&&, _T2&&)
     make_pair(_T1&& __x, _T2&& __y)
     ^
/usr/include/c++/4.8.2/bits/stl_pair.h:276:5: note:   template argument deduction/substitution failed:
function.cc:17:65: note:   cannot convert ‘&A::a’ (type ‘int (A::*)(int, std::string) {aka int (A::*)(int, std::basic_string<char>)}’) to type ‘std::function<int(int, std::basic_string<char>)>&&’
         m.insert(std::make_pair<string, process_func>("a", &A::a));

错误是什么意思?如何解决?

1 个答案:

答案 0 :(得分:1)

虽然函数“ a”和“ b”不依赖于“ this”(它们不访问类A中的任何内容),但是编译器不够聪明,无法推断出这一点。因此,该错误意味着您正在尝试将“方法的指针”转换为“函数的指针”,这是不正确的转换。 “方法的指针”要求和要调用的对象。您需要将方法“ a”和“ b”声明为“静态”,以表明它们实际上是独立的函数,而不是类的方法。