C++11 线程 - 非静态成员函数的无效使用 - 工作 gcc 5.1.0 损坏的 gcc 7.3.1

标签 c++ c++11 compiler-errors stdthread

代码:

    // create class instance  
    MC_THREAD MTHR;  
    // set some values in the class  
    MTHR.setup_mc_thread("com6", &es);  
    // create an thread to run the non-static member function   
    std::thread MCTHR(MC_THREAD::start_mc_thread, std::ref(MTHR)); 

函数的定义是:

    void MC_THREAD::start_mc_thread(){ 
        while(1){
            //do_stuff
        }
    } 

以上代码使用基于 gcc 5.1.0 的 TDM-GCC 编译器在 Windows 8 和 10 上编译(并正常工作)。

上面的代码在 linux 上使用 gcc 7.3.1 生成以下错误:
错误:无效使用非静态成员函数‘void MC_THREAD::start_mc_thread()’|

产生错误的机器正在运行 fedora 27 using gcc (GCC) 7.3.1 20180303 (Red Hat 7.3.1-5)

如有任何建议,我们将不胜感激!

已解决:请参阅下方 Sam 的评论

还必须链接 pthread。

最佳答案

我最初认为问题出在 std::reference_wrapper 的使用上。但是编译错误实际上是由于类成员函数需要是一个指针。以下使用 gcc 7.3.1 编译:

#include <thread>
#include <utility>
#include <functional>

class x {
public:

    void start_thread();
};

int main()
{
    x y;

    std::thread thr{&x::start_thread, std::ref(y)};
}

为类成员启动线程的常用方法是传递一个普通指针作为类实例。这也适用,在这种情况下:

std::thread thr{&x::start_thread, &y};

这是更常见的语法。引用包装器并不是真正需要的。但在所有情况下,第一个参数必须是指向类方法的指针。 &x::start_thread就是这样一个指针。 x::start_thread 本身不是。这才是真正的问题。

std::thread 构造函数的参数 is specified merely as...

f - Callable object to execute in the new thread

你必须真正深入研究the definition of a callable object .我想到的基本用法对应于此处列出的可调用对象的第三个选项。但是引用包装器也是可以接受的。但是,在所有情况下,您都必须将指向成员函数的指针作为第一个参数。

关于C++11 线程 - 非静态成员函数的无效使用 - 工作 gcc 5.1.0 损坏的 gcc 7.3.1,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49685127/

相关文章:

c++ - Qt 应用程序的布局设计问题

c++ - 假设 sizeof(std::unordered_map<std::string, T>) 对于所有 T 都相同实际上是安全的吗?

java - <T扩展A <T >>和Eclipse Compiler形式的Java泛型

Java初学者,类构造函数错误,找不到参数

c++ - 为什么命名空间的使用会破坏 MinGW 编译?

c++ - 从 unordered_multiset 读取会导致崩溃

c++ - C 中的 Canny 边缘检测器

c++ - 将正则表达式与组相交,如何导出分组位的交集?

c++ - 如何检查我的模板类是否属于特定类类型?

c++ - 为什么填充我的 std::vector 的运行时间在 0 到 ~16 毫秒之间跳跃?