void assign_task_to_agv(std::vector<Task>& tasks, std::vector<AGV>& agvs);,void MainWindow::moveAgvs(int i),void MainWindow::action_agv() { std::vectorstd::thread threads; threads.push_back(std::thread(&AGVScheduler::assign_task_to_agv, std::ref(tasks), std::ref(agvs))); // 分配小车 for (int i = 0; i < agvs.size(); i++) { threads.push_back(std::thread(& MainWindow::moveAgvs, i)); // 更新 AGV } for (auto& t : threads) { t.join(); ,報錯:no matching function for call to “std:: thread :: _ lnvoker<std::tuple<std::tuple<void(AGVScheduler...怎麽修改
时间: 2024-01-20 15:02:39 浏览: 132
这个错误通常是由于参数类型不匹配导致的。在这段代码中,错误可能是由于 `AGVScheduler::assign_task_to_agv` 函数的参数类型与 `std::thread` 构造函数所需的参数类型不匹配。
请检查 `AGVScheduler::assign_task_to_agv` 函数的定义和声明,确保其参数类型与所需的参数类型一致。如果参数类型正确,请检查代码中是否存在其他语法错误或类型不匹配的情况。另外,在调用 `std::thread` 构造函数时,需要将函数指针和参数一起传递,正确的写法应该是:
```
threads.push_back(std::thread(&AGVScheduler::assign_task_to_agv, std::ref(tasks), std::ref(agvs)));
```
这样就可以将 `tasks` 和 `agvs` 作为参数传递给 `AGVScheduler::assign_task_to_agv` 函数,并在新的线程中运行该函数。注意,这里使用了 `std::ref` 来将 `tasks` 和 `agvs` 引用传递给线程,避免了拷贝。
相关问题
void assign_task_to_agv(std::vector<Task>& tasks, std::vector<AGV>& agvs);怎麽修改: threads.push_back(std::thread(&AGVScheduler::assign_task_to_agv, std::vector<Task>& tasks, std::vector<AGV>& agvs));
在创建新的线程时,需要将函数的参数直接传递给 `std::thread` 构造函数,不需要在参数类型前面加上参数名。因此,正确的写法应该是:
```
threads.push_back(std::thread(&AGVScheduler::assign_task_to_agv, std::ref(tasks), std::ref(agvs)));
```
这样就可以将 `tasks` 和 `agvs` 作为参数传递给 `AGVScheduler::assign_task_to_agv` 函数,并在新的线程中运行该函数。注意,这里使用了 `std::ref` 来将 `tasks` 和 `agvs` 引用传递给线程,避免了拷贝。
void MainWindow::moveAgvs(int i),void AGVScheduler::assign_task_to_agv(std::vector<Task>& tasks, std::vector<AGV>& agvs),以下代碼報錯:void MainWindow::action_agv() { std::vector<std::thread> threads; threads.push_back(std::thread(&AGVScheduler::assign_task_to_agv, std::ref(tasks), std::ref(agvs))); // 分配小车 for (int i = 0; i < agvs.size(); i++) { threads.push_back(std::thread(&moveAgvs, i));// 更新 AGV } for (auto& t : threads) { t.join(); } }
这段代码报错的原因是在调用"std::thread"的构造函数时,传递给"AGVScheduler::assign_task_to_agv"函数的参数列表中多了一个右括号")"。您可以将代码修改为以下形式:
```c++
void MainWindow::action_agv() {
std::vector<std::thread> threads;
threads.push_back(std::thread(&AGVScheduler::assign_task_to_agv, std::ref(tasks), std::ref(agvs))); // 分配小车
for (int i = 0; i < agvs.size(); i++) {
threads.push_back(std::thread(&moveAgvs, i)); // 更新 AGV
}
for (auto& t : threads) {
t.join();
}
}
```
将多余的右括号")"删除即可。另外,您需要确保"tasks"和"agvs"向量在调用"action_agv"函数时已经被正确初始化,以避免其他潜在的运行时错误。
阅读全文