不能将std :: bind返回值赋给std :: function

时间:2017-06-13 04:36:51

标签: c++ c++11 c++14 bind stdbind

我一直在尝试编写一段非常简单的代码,但它似乎无法正常工作,我无法理解编译器错误。

代码:

#include <iostream>
#include <sstream>
#include <functional>

class c
{
public:
    void test(std::stringstream ss){
        std::cout<<ss.str()<<std::endl;
    }

    void test2(std::stringstream ss){
        const auto bound=std::bind(&c::test,this, ss);
        std::function<void()> f(bound);
        f();
    }

};

void test1(const std::stringstream ss){
    std::cout<<ss.str()<<std::endl;
}

int main(){         
    std::stringstream ss;
    ss<<"hello world";

    //first
    const auto bound=std::bind(&test1,ss);
    std::function<void()> f(bound);
    f();
    //second
    C obj;
    obj.test2(ss);
    return 0;               
}                   

错误:

bind.cpp:14:32: error: no matching function for call to ‘std::function<void()>::function(const std::_Bind<std::_Mem_fn<void (c::*)(std::__cxx11::basic_stringstream<char>)>(c*, std::__cxx11::basic_stringstream<char>)>&)’
  std::function<void()> f(bound);
                               ^
bind.cpp:30:31: error: no matching function for call to ‘std::function<void()>::function(const std::_Bind<void (*(std::__cxx11::basic_stringstream<char>))(std::__cxx11::basic_stringstream<char>)>&)’
  std::function<void()> f(bound);
                               ^

我正在编译:{{1​​}}。 我看到here接受的答案建议使用lambdas而不是std :: bind但是,有人可以告诉为什么上面代码中的第一次和第二次使用都不起作用吗?

1 个答案:

答案 0 :(得分:4)

您遇到的问题与 @Override public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { super.onRequestPermissionsResult(requestCode, permissions, grantResults); if (requestCode == PERMISSION_GPS_CODE) { if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { Toast.makeText(this, location_permission_granted_msg, Toast.LENGTH_SHORT).show(); } else { Toast.makeText(this, location_permission_not_granted_msg, Toast.LENGTH_SHORT).show(); } } } 没有复制构造函数的事实有关。

在几个函数中使用std::stringstream作为参数类型而不是const std::stringstream&可以解决问题。

std::stringstream