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_async
? Detect
函数是什么?请尝试创建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”的属性