Jon*_*Mee 11 c++ methods member-function-pointers function-pointers dereference
当一个成员函数指针返回到该类的一个成员函数中的一个类时,我仍然需要指定该类.我不能简单地拿地址.例如,此代码工作正常:
class Foo {
public:
void func(int param) { cout << param << endl; }
void (Foo::*getPointer())(int) { return &Foo::func; }
};
Run Code Online (Sandbox Code Playgroud)
但如果在getPointer
我尝试简单地做:return &func
我得到这个错误:
prog.cpp:在成员函数'
void (Foo::* Foo::getPointer())(int)
':
prog.cpp:8:43:错误:ISO C++禁止获取非限定或带括号的非静态成员函数的地址,以形成指向成员函数的指针.说'&Foo::func
'[-fpermissive]
void (Foo::*getPointer())(int) { return &func; }
为什么我必须在我所在的上下文中指定类?
指针和指向成员的指针是不同的类型,我们可以从 C++ 标准草案部分3.9.2
[basic.compound] 中看到,其中包括指针的复合类型以及指向非静态类成员的指针,并注释:
静态类成员是对象或函数,指向它们的指针是普通的对象或函数指针
我认为这个问题在《带注释的 C++ 参考手册》( ARM )中Johannes 的回答中得到了很好的描述:
请注意,必须显式使用取址运算符来获取指向成员的指针;没有隐式转换...如果有的话,我们在成员函数的上下文中就会产生歧义...例如,
Run Code Online (Sandbox Code Playgroud)void B::f() { int B::* p = &B::i; // ok p = B::i; // error: B::i is an int p = &i; // error: '&i'means '&this->i' // which is an 'int*' int *q = &i; // ok q = B::i; // error: 'B::i is an int q = &B::i; // error: '&B::i' is an 'int B::*' }
特别是这些行:
int B::* p = &B::i; // OK
Run Code Online (Sandbox Code Playgroud)
和:
p = &i; // error: '&i'means '&this->i' which is an 'int*'
Run Code Online (Sandbox Code Playgroud)
展示合格名称和不合格名称之间的区别。
归档时间: |
|
查看次数: |
872 次 |
最近记录: |