static函数 函数调用缺少参数列表;请使用“&XXX”创建指向成员的指针;类的static成员函数
2016-10-07 23:31
766 查看
如下:
编译出错:
> 正在对“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”创建指向成员的指针
正确修改:
或者把B_fun改成全局函数,不属于该类就行。
错误原因是:静态成员函数的地址可用普通函数指针储存,而普通成员函数地址需要用类成员函数指针来储存,因为普通成员函数要执行时我们必须要确定他是属于哪个类对象才能执行,而类的static函数是不属于这个类的,他是在编译器编译时期就已经确定的,普通成员函数是在有了类对象之后才能执行。
类的成员函数指针作为参数传递给其他函数和普通函数指针的传递是不同的,普通函数指针的传递只要在参数声明中声明是相同参数个数、类型和相同返回类型的函数指针int
(*p)(int),传递时只需传函数名就可以了。可是传递成员函数指针用此方法却不能工作。指针是指向一些内存地址的变量,既可以是数据的地址也可以是函数的地址。C++的 成员指针遵从同样的原则。但在类内部没有地址;选择一个类的成员意味着在类中偏移。只有把这个偏移和具体对象的开始地址结合,才能得到实际地址。成员指针的语法要求选择一个对象的同时逆向引用成员指针。
当然,可以把成员函数声明为static(静态函数),这样传递它的指针就像传递普通函数一样。
参考:http://blog.csdn.net/u011220857/article/details/37657713
#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
相关文章推荐
- “error C3867: “XXX”: 函数调用缺少参数列表;请使用“&XXX”创建指向成员的指针”的错误
- “error C3867: “XXX”: 函数调用缺少参数列表;请使用“&XXX”创建指向成员的指针”的错误
- error C3867: “Point::getX”: 函数调用缺少参数列表;请使用“&Point::getX”创建指向成员的指针
- Qt使用回调函数报错“函数调用缺少参数列表,请使用&xxx创建指向成员的指针”解决办法
- 函数调用缺少参数列表;请使用“&****Dlg::getThread”创建指向成员的指针”--多线程函数调用
- error: 函数调用缺少参数列表;请使用“&BinTree<char>::_PrintNode”创建指向成员的指针
- error C3867: “A::fun1”: 函数调用缺少参数列表;请使用“&A::fun1”创建指向成员的指针
- “Caculate::writehtml”: 函数调用缺少参数列表;请使用“&Caculate::writehtml”创建指向成员的指针
- 函数调用缺少参数列表;请使用“&Student::Printf”创建指向成员的指针 问题解析
- 巧妙解决问题:&CMFCcodeDlg::RunCommands”创建指向成员的指针。MFC多线程调用要求调用的接口必须是全局函数或静态成员函数
- 使用CreateThread 时报错,函数调用缺少参数列表
- 在VC6.0中创建和使用静态链接库&amp;amp;&amp;amp;C如何调用C++ 成员函数
- my_mouse_callback”: 函数调用缺少参数列表
- [疑问]C/C++中为什么在类外利用多态基类指向派生类指针可以调用类的私有成员函数?
- static"不应在文件范围内定义的成员函数上使用
- C++中,如何定义和使用指向成员函数的指针
- 多线程error C3867: 函数调用缺少参数列表问题解决办法:
- 指向函数的指针作为参数时的使用方法
- c++11 条款22:当使用Pimpl(指向实现的指针)时,在实现文件里定义特定的成员函数
- 大胆使用指向成员函数的指针