您的位置:首页 > 其它

static函数 函数调用缺少参数列表;请使用“&XXX”创建指向成员的指针;类的static成员函数

2016-10-07 23:31 309 查看
如下:

#include <stdio.h>

typedef int ( *FUNC )( void *param );

class CA
{
public:
CA();
void init(FUNC fun){};
};

class CB
{
public:
CA A;
int B_fun(void *param)
{
return 0;
}
public:
void test()
{
A.init(B_fun);
}
};

int main()
{
return 0;
}

编译出错:

>  正在对“Debug\Temptest.unsuccessfulbuild”执行 Touch 任务。

1>ClCompile:

1>  main.cpp
1>e:\test\temptest\temptest\main.cpp(23): error C3867: “CB::B_fun”: 函数调用缺少参数列表;请使用“&CB::B_fun”创建指向成员的指针

正确修改:

#include <stdio.h>

typedef int ( *FUNC )( void *param );

class CA
{
public:
CA();
void init(FUNC fun){};
};

class CB
{
public:
CA A;
static int B_fun(void *param)
{
return 0;
}
public:
void test()
{
A.init(B_fun);
}
};

int main()
{
return 0;
}

或者把B_fun改成全局函数,不属于该类就行。

错误原因是:静态成员函数的地址可用普通函数指针储存,而普通成员函数地址需要用类成员函数指针来储存,因为普通成员函数要执行时我们必须要确定他是属于哪个类对象才能执行,而类的static函数是不属于这个类的,他是在编译器编译时期就已经确定的,普通成员函数是在有了类对象之后才能执行。

typedef void (*b)();
class A{
public:
static void func1();
void func2();
void fun()
{
b myfunc1 = func1;  //valid
b myfunc2 = func2;   //error   传指针func2和调用func2()是不一样的
}
};


类的成员函数指针作为参数传递给其他函数和普通函数指针的传递是不同的,普通函数指针的传递只要在参数声明中声明是相同参数个数、类型和相同返回类型的函数指针int
(*p)(int),传递时只需传函数名就可以了。可是传递成员函数指针用此方法却不能工作。指针是指向一些内存地址的变量,既可以是数据的地址也可以是函数的地址。C++的 成员指针遵从同样的原则。但在类内部没有地址;选择一个类的成员意味着在类中偏移。只有把这个偏移和具体对象的开始地址结合,才能得到实际地址。成员指针的语法要求选择一个对象的同时逆向引用成员指针。
当然,可以把成员函数声明为static(静态函数),这样传递它的指针就像传递普通函数一样。

参考:http://blog.csdn.net/u011220857/article/details/37657713
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐