我知道这个主题被问了很多时间,但我不明白我的代码中的错误在哪里。
我有一个我定义的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
答案 0 :(得分:2)
尽管您仍未设法提供MCVE,但我设法破译了您的问题。您需要在传递std::ref
时使用img
:
std::thread(&Foo::DoSomethingAsync, this, std::ref(img));
当您阅读std::thread::thread
's documentation时,推理变得很明显 - 您应该在发布StackOverflow之前完成此操作。
3)创建新的
std::thread
对象并将其与执行线程相关联。新的执行线程开始执行std::invoke(decay_copy(std::forward<Function>(f)), decay_copy(std::forward<Args>(args))...);
live example on wandbox (请在将来创建一个自己说明错误的内容!)
此外:
您在 rvalue 上使用std::move
。这是错误的,因为它是不必要的并且阻止复制省略。
只需使用 lambda表达式来初始化std::thread
- 它会更容易阅读并且不会出现令人惊讶的行为。