C++ 线程错误:没有名为“type”的类型

ale*_*ark -4 c++ multithreading c++11

我知道这个话题被问了很多次,但我不明白我的代码中的错误在哪里。

\n\n

我有一个 foo.h 文件,我在其中定义了:

\n\n
class Foo {\n    public:\n       Foo();\n       ~Foo();\n       void DoSomething(cv::Mat& img);\n       void DoSomethingAsync(cv::Mat& img);\n\n    private:\n       bool isFinished = false;\n};\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后是这样的 foo.cpp:

\n\n
Foo:Foo() {}\n\nFoo:~Foo() {}\n\nvoid Foo::DoSomethingAsync(cv::Mat& img) {\ntry {\n    IsFinished = true;\n} catch(exception& e) {\n}   \n\nvoid Foo::DoSomething(cv::Mat& img) {\n thread_mutex.lock();\n thread_async = std::move(std::thread(&Foo::DoSomethingAsync, this, img));\nthread_mutex.unlock();\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

从我的 main.cpp 文件中,我调用该函数:

\n\n
Foo foo;\nfoo.DoSomething(im);\n
Run Code Online (Sandbox Code Playgroud)\n\n

当我编译时,我总是收到此错误:

\n\n
error: no type named \xe2\x80\x98type\xe2\x80\x99 in \xe2\x80\x98class std::result_of<std::_Mem_fn<void (ObjectDetector::*)(cv::Mat&)>(ObjectDetector*, cv::Mat)>\xe2\x80\x99\n   typedef typename result_of<_Callable(_Args...)>::type result_type;\n                                                         ^\n/usr/include/c++/5/functional:1526:9: error: no type named \xe2\x80\x98type\xe2\x80\x99 in \xe2\x80\x98class std::result_of<std::_Mem_fn<void (ObjectDetector::*)(cv::Mat&)>(ObjectDetector*, cv::Mat)>\xe2\x80\x99\n     _M_invoke(_Index_tuple<_Indices...>)\n
Run Code Online (Sandbox Code Playgroud)\n\n

你能解释一下为什么吗?

\n\n

在我的 CMake 中,我使用 -pthread 设置变量 CMAKE_CXX_FLAGS

\n

Vit*_*meo 7

尽管您仍未能提供 MCVE,但我还是设法破译了您的问题。您需要std::ref在通过时使用img

std::thread(&Foo::DoSomethingAsync, this, std::ref(img));
Run Code Online (Sandbox Code Playgroud)

std::thread::thread当您阅读的文档时,推理就会变得显而易见- 您应该在在 StackOverflow 上发布之前完成此操作。

3) 创建新std::thread对象并将其与执行线程关联。新的执行线程开始执行

std::invoke(decay_copy(std::forward<Function>(f)), 
            decay_copy(std::forward<Args>(args))...);
Run Code Online (Sandbox Code Playgroud)

wandbox 上的实时示例 (请自己创建一个来演示将来的错误!)


还:

  • 您正在使用std::movervalue 这是错误的,因为它是不必要的并且会阻止复制省略

  • 只需使用lambda 表达式来初始化您的std::thread- 它将更易于阅读并且具有更少的令人惊讶的行为。