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

Posted

技术标签:

【中文标题】C++ 线程错误:没有名为“type”的类型【英文标题】:C++ thread error: no type named ‘type’ 【发布时间】:2017-03-10 12:34:16 【问题描述】:

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

我有一个已定义的 foo.h 文件:

class Foo 
    public:
       Foo();
       ~Foo();
       void DoSomething(cv::Mat& img);
       void DoSomethingAsync(cv::Mat& img);

    private:
       bool isFinished = false;
;

然后是这样的 foo.cpp:

Foo:Foo() 

Foo:~Foo() 

void Foo::DoSomethingAsync(cv::Mat& img) 
try 
    IsFinished = true;
 catch(exception& e) 
   

void Foo::DoSomething(cv::Mat& img) 
 thread_mutex.lock();
 thread_async = std::move(std::thread(&Foo::DoSomethingAsync, this, img));
thread_mutex.unlock();

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

Foo foo;
foo.DoSomething(im);

编译的时候总是报这个错:

error: no type named ‘type’ in ‘class std::result_of<std::_Mem_fn<void (ObjectDetector::*)(cv::Mat&)>(ObjectDetector*, cv::Mat)>’
   typedef typename result_of<_Callable(_Args...)>::type result_type;
                                                         ^
/usr/include/c++/5/functional:1526:9: error: no type named ‘type’ in ‘class std::result_of<std::_Mem_fn<void (ObjectDetector::*)(cv::Mat&)>(ObjectDetector*, cv::Mat)>’
     _M_invoke(_Index_tuple<_Indices...>)

你能解释一下为什么吗?

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

【问题讨论】:

什么是thread_asyncDetect 函数是什么?请尝试创建Minimal, Complete, and Verifiable Example 并展示给我们。 请提供minimal reproducible example。您的示例不包含错误包含的类型的名称。而且,进一步增加了它不是一个真实示例的疑虑:您有foo.Detect(im); 方法调用,而Detect 没有在Foo 中定义。 @alexmark 请注意,重复提问并删除它们可能会导致您无法在 *** 上提问。 对不起@TheQuantumPhysicist 我试图调整我的问题以准备更好的代码 【参考方案1】:

尽管您仍未设法提供 MCVE,但我设法破译了您的问题。传递img时需要使用std::ref

std::thread(&Foo::DoSomethingAsync, this, std::ref(img));

当您阅读 std::thread::thread's documentation 时,推理变得显而易见 - 您应该在发布到 *** 之前完成此操作。

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

std::invoke(decay_copy(std::forward<Function>(f)), 
            decay_copy(std::forward<Args>(args))...);

live example on wandbox(以后请自己创建一个演示错误!)


还有:

您在右值上使用std::move。这是错误的,因为它是不必要的并且可以防止复制省略

只需使用 lambda 表达式 来初始化您的 std::thread - 它会更容易阅读并且不会出现令人惊讶的行为。

【讨论】:

以上是关于C++ 线程错误:没有名为“type”的类型的主要内容,如果未能解决你的问题,请参考以下文章

使用 mapstruct 进行映射:错误:(22,48)java:参数“quote”的类型没有名为“quote_type”的属性

命名空间“std”中没有名为“shared_ptr”的类型

错误:只能有一种名为“Upload”的类型 - Apollo、Express、Type-Graphql

(类型)值和类型(值)有啥区别?

C++ STL教程(13)容器适配器使用

c++线程池std::promise和函数类型错误