我一直在尝试编写一段非常简单的代码,但它似乎不起作用,我无法从编译器错误中理解任何意义。
法典:
#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;
}