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

时间:2017-03-10 12:34:16

标签: c++ multithreading c++11

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

我有一个我定义的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

1 个答案:

答案 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 - 它会更容易阅读并且不会出现令人惊讶的行为。