【问题标题】:C++ std::thread "Attempt to use a deleted function"C++ std::thread“尝试使用已删除的函数”
【发布时间】:2015-05-25 07:59:37
【问题描述】:

这是相关的代码和相关的错误,我真的不知道该怎么做。

Breaker::Thread::Thread(std::string name, std::string desc, void* func)
{
    std::thread _thread(func);

    _thread.join();
}

那个在thread.cpp,下一个在log.cpp...

thread = new Breaker::Thread("System Log", loop);

void* Breaker::Log::loop()
{
    add("test");
}

以下是相关错误:

In file included from /home/nope/Documents/dev/C++/Breaker Engine/src/core/thread.cpp:25:
In file included from /home/nope/Documents/dev/C++/Breaker Engine/src/core/thread.h:28:
/usr/bin/../include/c++/v1/thread:332:5: error: attempt to use a deleted function
    __invoke(_VSTD::move(_VSTD::get<0>(__t)), _VSTD::move(_VSTD::get<_Indices>(__t))...);
    ^
/usr/bin/../include/c++/v1/thread:342:5: note: in instantiation of function template specialization 'std::__1::__thread_execute<void *>' requested here
    __thread_execute(*__p, _Index());
    ^
/usr/bin/../include/c++/v1/thread:354:42: note: in instantiation of function template specialization 'std::__1::__thread_proxy<std::__1::tuple<void *> >'
      requested here
    int __ec = pthread_create(&__t_, 0, &__thread_proxy<_Gp>, __p.get());
                                         ^
/home/nope/Documents/dev/C++/Breaker Engine/src/core/thread.cpp:95:14: note: in instantiation of function template specialization
      'std::__1::thread::thread<void *&, void>' requested here
        std::thread _thread(func);
                    ^
/usr/bin/../include/c++/v1/type_traits:1027:5: note: '~__nat' has been explicitly marked deleted here
    ~__nat() = delete;
    ^

【问题讨论】:

    标签: c++ linux multithreading c++11


    【解决方案1】:

    我认为问题在于参数func的声明。它被声明为 void 指针,而不是指向返回 void 的函数的指针。

    而不是,

    Breaker::Thread::Thread(std::string name, std::string desc, void* func)
    

    我想你的意思是,

    Breaker::Thread::Thread(std::string name, std::string desc, void (*func) ())
    

    注意,loop 必须是静态成员才能正常工作。

    此外,您可能需要考虑使用 std::function。它比使用 void 指针更现代、更简洁。

    Breaker::Thread::Thread(std::string name, std::string desc, std::function<void()> func)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-10
      • 1970-01-01
      • 2017-08-31
      • 2014-04-16
      • 1970-01-01
      • 1970-01-01
      • 2020-03-26
      相关资源
      最近更新 更多