2014-07-20 82 views
0

我使用g ++以及我無法編譯後續碼儘管如http://www.codeproject.com/Articles/7150/Member-Function-Pointers-and-the-Fastest-Possible方法指針分配

書面方式描述它我也使用開關-std = C++ 11

struct X{ 
    int a; 
    int sz(){return 17;} 
}; 

typedef int X::*methodPointer1(); 


methodPointer1 p1=X::&sz; 

誤差是:「錯誤:預計不合格id之前'&'令牌'

任何提示?

+3

嘗試'的typedef int(X :: * methodPointer1)();' – 0x499602D2

+0

'儘管如文中所述寫入了' - 這是什麼意思?它是否在一本書中? –

+1

它也應該是'&X :: sz' –

回答

0

正如0x499602D2和Brandon所述,代碼中存在兩個單獨的問題。

正確的語法typedef荷蘭國際集團的指針,成員包括括號(就像一個函數指針):

typedef int (X::*methodPointer1)(); 

要指向指針到適當的成員,使用此語法:

methodPointer1 p1=&X::sz; 

這裏的指針成員語法非常直觀(X::sz是成員函數的名稱,所以&X::sz是它的地址)。

+0

爲什麼這個文件:http://www.codeproject.com/Articles/7150/Member-Function-Pointers-and-the-Fastest-Possible使用其他語法與p1 = X :: &sz;(並且不起作用)。爲什麼使用語法X :: * methodPointer1而不是* X :: methodPointer1(如在下面的行中使用&)。 –

1

一個更清潔的方式來實現我想你想實現會是這樣:

#include <functional> 

struct X { 
    int a; 
    int sz() { return 17; } 
}; 

using methodPointer1 = std::function<int()>; 

X obj; 
methodPointer1 func = std::bind(&X::sz, &obj); 
func(); 

您也可以使用placeholders的接受參數的成員函數:

struct X { 
    int a; 
    void set_a(int v) { a = v; } 
}; 

X obj; 
std::function<void (int)> func = std::bind(&X::set_a, &obj, std::placeholders::_1); 
func(10);