template<class T, class ...Args> auto ThreadPool::InsertQueue(T&& t, Args&& ...args)->future<decltype(t(args...))> { using Type = decltype(t(args...)); auto task = make_shared<packaged_task<Type()>>(bind(forward<T>(t), forward<Args>(args)...)); future<Type> res = task->get_future(); { unique_lock<mutex> lock(mtx_queue); if (stop) { throw runtime_error("停止。。"); } task.emplace([task] { (*task)(); }); } cv.notify_one(); return res; }报错严重性 代码 说明 项目 文件 行 禁止显示状态 错误 C2039 "emplace": 不是 "std::shared_ptr<std::packaged_task<Type (void)>>" 的成员 C++More F:\LH_Work\C++Work\C++More\C++More\main.cpp 103
时间: 2024-04-10 20:27:39 浏览: 15
这个错误是因为在这段代码中,`task` 是一个 `shared_ptr` 对象,而 `shared_ptr` 类型没有名为 `emplace` 的成员函数。
解决这个错误的方法是将 `task` 的类型更正为 `std::packaged_task<Type()>`,而不是 `std::shared_ptr<std::packaged_task<Type()>>`。然后在 lambda 表达式中直接使用 `task()` 调用任务函数。
以下是修改后的代码:
```cpp
template<class T, class ...Args>
auto ThreadPool::InsertQueue(T&& t, Args&& ...args) -> future<decltype(t(args...))>
{
using Type = decltype(t(args...));
auto task = make_shared<packaged_task<Type()>>(bind(forward<T>(t), forward<Args>(args)...));
future<Type> res = task->get_future();
{
unique_lock<mutex> lock(mtx_queue);
if (stop)
{
throw runtime_error("停止。。");
}
tasks.emplace([task]
{
(*task)();
});
}
cv.notify_one();
return res;
}
```
请注意,我还修改了 `task.emplace` 为 `tasks.emplace`,因为任务队列应该是 `tasks` 而不是 `task`。