我观察到,当我尝试获取指向成员函数的指针时,不同的GCC版本的行为有所不同。使用不同编译器的成员函数指针
class Foo {
public:
void bar() { }
};
int main() {
void (Foo::*func1)(void) = Foo::bar; // Error with gcc 4.3.2 and gcc 7.1.0
return 0;
}
上面的代码编译细跟GCC 4.9.2(MinGW的),GCC 6.3和铛4.0上的窗户。 但导致以下的错误消息与GCC 4.3.2和GCC 7.1.0(在Linux):
error: invalid use of non-static member function 'void Foo::bar()'
如果我改变了行explcitly通过像这样操作者地址请求ADRESS :
void (Foo::*func1)(void) = &Foo::bar; // Added an ampersand
它编译没有与所有被测试的编译器错误。
请注意,可能与其他版本有相同的区别,这只是我可以测试的一个。
那么哪一个是对的?
注意:这不是this问题的副本。我知道如何解决它。我的问题是关注不同的编译器,以及它们为什么表现不同。正如我所知,这两个变体应该在语法上是正确的,但不同的编译器似乎以不同的方式处理它。
[非法使用非静态成员函数C++](https:// stackoverflow。com/questions/41326376/invalid-use-of-non-static-member-function-c) – melpomene
你对那个指向非静态成员函数的指针做了什么?你如何通过没有'Foo'实例的指针调用这个函数? – JimmyB
@JimmyB我不使用它,因为这只是一个最小,完整和可验证的例子。我意识到在编写Qt代码的时候,你可以用指向非静态成员函数的指针创建连接。但如果我想要,我可以使用它像'Foo foo; (foo。* func1)();' – exilit