我正在尝试创建一个方法队列,这些方法使用 std::bind() 绑定(bind)到对象。当调用 std::bind() 时绑定(bind)方法的参数(另一个类的对象)。出于某种原因,我无法让它工作。
解析器.h
#ifndef PARSER_H
#define PARSER_H
class File_Descriptor;
class Parser{
public:
void parse(File_Descriptor *file_descr);
};
#endif
解析器.cpp
#include <iostream>
#include "parser.h"
#include "file_descriptor.h"
using namespace std;
void Parser::parse(File_Descriptor *file_descr){
cout << file_descr->id << endl;
}
文件描述符.h
#ifndef FILE_DESCRIPTOR_H
#define FILE_DESCRIPTOR_H
#include "parser.h"
class File_Descriptor{
public:
File_Descriptor(const int &id);
Parser parser;
int id;
};
#endif
文件描述符.cpp
#include "file_descriptor.h"
File_Descriptor::File_Descriptor(const int &id):id(id){}
主要.cpp
#include <functional>
#include <queue>
#include "file_descriptor.h"
#include "parser.h"
using namespace std;
int main(){
File_Descriptor file_descr(123);
function<void(File_Descriptor*)> task = bind(&Parser::parse, &file_descr.parser, &file_descr);
//task(); file_descr(123) is not bound to &Parser::parse(File_Descriptor *file_descr)
queue<function<void(File_Descriptor*)>> task_queue;
task_queue.push(task);
function<void(File_Descriptor*)> exec_task = task_queue.pop();
exec_task();
return 0;
}
错误信息
main.cpp: In function ‘int main()’:
main.cpp:17:64: error: conversion from ‘void’ to non-scalar type
‘std::function<void(File_Descriptor*)>’ requested
17 | function<void(File_Descriptor*)> exec_task = task_queue.pop();
| ~~~~~~~~~~~~~~^~
main.cpp:18:15: error: no match for call to ‘(std::function<void(File_Descriptor*)>) ()’
18 | exec_task();
| ^
In file included from /usr/include/c++/9/functional:59,
from main.cpp:1:
/usr/include/c++/9/bits/std_function.h:683:5: note: candidate: ‘_Res std::function<_Res(_ArgTypes ...)>::operator()(_ArgTypes ...) const [with _Res = void; _ArgTypes = {File_Descriptor*}]’
683 | function<_Res(_ArgTypes...)>::
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~~
/usr/include/c++/9/bits/std_function.h:683:5: note: candidate expects 1 argument, 0 provided
最佳答案
如果您有一个带有两个参数的函数,并且绑定(bind)了两个参数,还剩下多少个?不是一个,零个。所以你的 std::function
s 错了,应该是std::function<void()>
. std::bind
没有问题.还有 std::queue<T>::pop
返回 void
,而不是弹出的元素。你必须使用 front
, 然后 pop
.
int main() {
File_Descriptor file_descr(123);
std::function<void()> task = std::bind(&Parser::parse, &file_descr.parser, &file_descr);
task();
std::queue<std::function<void()>> task_queue;
task_queue.push(task);
std::function<void()> exec_task = std::move(task_queue.front());
task_queue.pop();
exec_task();
}
https://stackoverflow.com/questions/68693967/
相关文章:
javascript - 如何使用 Axios 拦截器向响应添加一些 header ?
c# - 如何在控制台应用程序 .NET Core (C#) 中制作打开文件对话框?
c - 通过在未初始化的数据段 (bss) 中打印 "garbage values",我们可以映射出
reactjs - 如何在 onSubmit 事件中使用 react-query useQuery?
css - 注入(inject)具有特定范围的 Chakra UI 全局样式
python - 根据python中另一个字符串元素的数量删除字符串元素