传递指向成员函数的指针在 MinGW-w64 中编译,但不在 gcc 中

Posted

技术标签:

【中文标题】传递指向成员函数的指针在 MinGW-w64 中编译,但不在 gcc 中【英文标题】:Pass pointer to member function compiles in MinGW-w64 but not in gcc 【发布时间】:2015-10-28 09:35:44 【问题描述】:

我有一个带有run() 非静态成员函数的Worker 对象。

一个对象已创建:

Worker * worker = new Worker();

在做:

std::thread(Worker::run, worker);

在 MinGW-w64 (gcc 4.9.1) 但在 Ubuntu 的 linux (gcc 5.2.1) 下编译(工作),我得到编译错误:

Invalid use of non-static member function

代码用-std=gnu++11编译

我知道在 MinGW 的情况下,指向成员函数的指针有一个带有Worker * this 参数的签名,允许像静态函数指针一样使用它。为什么在 linux 5.2.1 gcc 中禁止这样做,我应该怎么写?

编辑:我可以使用 lambda 或在 Worker::run 之前添加 & 来解决此问题,但各种 gcc 版本是否接受它的问题仍然存在。这是 MinGW 还是 gcc 4.9.1 的错误?

【问题讨论】:

【参考方案1】:

你需要使用

std::thread(&Worker::run, worker);

live example

【讨论】:

这行得通,谢谢。知道为什么 gcc 4.9.1 接受它而不用和号吗?这与标准中的任何变化有关吗? @galinette 它不应该工作,它也不能在 GCC 4.9.1 here 上工作。 MinGW-w64 错误呢?这很奇怪,因为它是一个不应该影响解析器的 gcc 端口。谜底…… @galinette 当然,这是可能的

以上是关于传递指向成员函数的指针在 MinGW-w64 中编译,但不在 gcc 中的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中将指向基类的指针传递给派生类的成员函数

将指向外部类模板的成员函数的指针传递给嵌套类

将指向成员函数的指针传递给单独的线程

C++成员函数指针指向全局函数指针

我应该如何将指向成员函数的指针传递给 OpenCV 中的 setMouseCallback?

从 C++ 的成员函数中获取指向成员函数的指针