static函式 函式呼叫缺少引數列表;請使用“&XXX”建立指向成員的指標;類的static成員函式
阿新 • • 發佈:2019-02-16
如下:
#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()是不一樣的
}
};
類的成員函式指標作為引數傳遞給其他函式和普通函式指標的傳遞是不同的,普通函式指標的傳遞當然,可以把成員函式宣告為static(靜態函式),這樣傳遞它的指標就像傳遞普通函式一樣。