将指针传递给静态方法
Posted
技术标签:
【中文标题】将指针传递给静态方法【英文标题】:Pass a pointer to a static method 【发布时间】:2013-12-02 18:08:00 【问题描述】:为什么编译器将&Foo::foo
视为void (*)()
。我希望它被视为void(Foo::*)()
,因为它是Foo
的成员。
class Foo
public:
static void foo ( void )
;
void foo ( void(Foo::*)(void) )
int main()
foo(&Foo::foo); // error: cannot convert ‘void (*)()’ to ‘void (Foo::*)()’
return 0;
【问题讨论】:
没有其他变体需要一个普通的函数成员,因为this
指针被隐式传递给这个函数(这就是 Foo::*
的用途)。
@g-makulik 对不起,我无法理解你的意思。能详细点吗?
克里斯的回答非常清楚地指出了这一点,void(Foo::*)()
仅适用于(非静态成员)。另请注意,用于取消引用成员函数指针的 ->*
形成了它自己的运算符,它不能被覆盖。
【参考方案1】:
您将函数 foo 声明为 static。
因此它不是 Foo 实例的成员函数。
此代码有效:
class Foo
public:
static void foo ( void )
void foo2()
;
void foo ( void(*)(void) )
void fooMember ( void(Foo::*)(void) )
int main()
foo(&Foo::foo);
fooMember(&Foo::foo2);
return 0;
编辑:我更新了描述并添加了一段代码。
【讨论】:
这是相当误导 - 它仍然是一个(静态)成员。更准确地说,指向成员的指针仅用于非静态成员,它们只能通过对象访问。 考虑将It is therefore no member function of Foo.
更改为 It is therefore not a member function of a Foo instance
,因为它是 Foo 类的成员。
我发现委托的 C++ 语法相当混乱。传递函数的可访问名称是什么? void(*)(void)
只是类型对...?以上是关于将指针传递给静态方法的主要内容,如果未能解决你的问题,请参考以下文章