invalid+use+of+non-static+member+function+问题

#include <iostream>


using namespace std;
class A
{
public :
    A (int i)
    {
        a = i;


    }
    int fun(int b)
    {
        return a*c+b;
    }
    int c;
private :
    int a;
};


int main()
{
    A x(18);
    int A::*pc;
    pc = &A::c;
    x.*pc = 5;
    int (A::*pfun)(int);
    pfun = A::fun;
    A *p = &x;
    cout << (p->*pfun)(10)<<endl;


    return 0;

}


会出现错误:error: invalid use of non-static member function 'int A::fun(int)'|


int (A::*pfun)(int)=A::fun;
改成
int (A::*pfun)(int)=&A::fun;

 

在C++语言中,对于一个由类名加俩冒号再加成员名构成的东西(学名叫“quilified-id”),比如:A::x,只有当x是A类的静态成员的时候,A::x才能表示一个左值。

而对于函数类型到函数指针类型的默认转换,只有当函数类型是左值的时候才行。所有对于非静态的成员函数,就不存在这种从函数类型到函数指针类型的默认转换,于是编译器也就不知道这个
p = A::f
该怎么搞了。

 

(1)要说函数地址确定不确定,由于非静态成员函数指针可以有多态行为,因此,至少在编译期,其地址还真的无法确定。
(2)虽然所有的编译器都肯定会把类的非静态成员函数的代码只生成一份(不管是编译时还是运行时),这一点跟非静态成员变量不一样,变量每个对象都有独立的一份。——但我认为,这依然是编译器的实现细节而已,而不是语言特性。从抽象的语言特性角度讲,非静态的成员函数跟非静态的成员变量一样,在没有对象实例的时候,是形不成左值的。

http://topic.csdn.net/t/20060906/11/5002223.html 
  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值