无法将 std::绑定返回值分配给 std::function



我一直在尝试编写一段非常简单的代码,但它似乎不起作用,我无法从编译器错误中理解任何意义。

法典:

#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);
                               ^

我正在编译:g++ -std=c++14 bind.cpp.我在这里看到公认的答案建议使用 lambda 而不是 std::bind 但是,谁能说出为什么上面代码中的第一次和第二次用法都不起作用?

您面临的问题与std::stringstream没有复制构造函数的事实有关。

这些问题

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

#include <iostream>
#include <sstream>
#include <functional>
class c
{
  public:
    // Change the argument to a const&
    void test(std::stringstream const& ss){
        std::cout<<ss.str()<<std::endl;
    }
    // Use std::cref to use a const& in the call to std::bind
    void test2(std::stringstream ss){
        const auto bound=std::bind(&c::test,this, std::cref(ss));
        std::function<void()> f(bound);
        f();
    }
};
// Change the argument to a const&
void test1(const std::stringstream & ss){
    std::cout<<ss.str()<<std::endl;
}
int main(){         
    std::stringstream ss;
    ss<<"hello world";
    //first
    // Use std::cref to use a const& in the call to std::bind
    const auto bound = std::bind(&test1, std::cref(ss));
    std::function<void()> f = bound;
    f();
    return 0;               
}

最新更新