gpt4 book ai didi

c++ - 无法将 std::bind 返回值分配给 std::function

转载 作者:搜寻专家 更新时间:2023-10-31 00:54:42 24 4
gpt4 key购买 nike

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

代码:

#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。我看到 here接受的答案建议使用 lambdas 而不是 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;
}

关于c++ - 无法将 std::bind 返回值分配给 std::function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44512483/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com