2012-06-05 57 views
4

代碼片段如下。無法理解爲什麼我得到這個錯誤。C++中的函數指針:錯誤:必須使用'。*'或' - > *'來調用函數中的指針 - 成員函數

void 
SipObj::check_each_field() 
{ 
map <std::string, sip_field_getter>::iterator msg; 
string str; 
char name[20]; 
bool res = false; 
sscanf(get_payload(), "%s %*s", name); 
LOGINFO(lc()) << "INVITE:" << name; 
str = name; 
msg = sip_field_map.find(str); 
if (msg != sip_field_map.end()) { 
    sip_field_getter sip_field = msg->second; 
    res = (this).*sip_field(); 
} 
} 

typedef bool (SipObj::*sip_field_getter)(); 
static map <std::string, sip_field_getter> sip_field_map; 

sip_field_getter is a place holder for function names 
+2

它是否與'這個 - > sip_field()'(AKA'(*此).sip_field()')工作? – chris

+0

@chris:你似乎真的很有幫助,但總是用評論而不是答案來處理......小心提供一個解釋爲什麼'this.'錯誤的答案?人們不願寫作已經存在於評論中的答案......感覺有點像作弊;) –

+2

@ K-ballo有時你只是想爲某人解決問題,而不是寫出完整的答案。一旦你開始寫答案,你需要深入並確保你100%正確。 –

回答

12
(this).*sip_field(); 

有兩個問題表達:

  1. this是一個指針,所以你必須使用->*調用通過指針成員函數就可以了。

  2. 函數調用(())具有比構件逐指針運營商(或者.*->*)更高的優先級,所以需要括號正確組的表達。

正確的表達是:

(this->*sip_field)(); 
+1

我從來不明白爲什麼'。*'和' - > *'沒有與' .'和' - >'(和函數調用)... – chtz

9

它看起來像你在一個指針上調用方法指針,但你用點星語法調用它。試着用

res = (this->*sip_field)(); 
+0

另一種選擇是(* this。* sip_field)(),儘管我認爲這在我看來有點複雜。 –

+0

你需要在'* this'附近加一個圓括號......所以,有點麻煩,容易出錯 –

3

正確的語法替換

res = (this).*sip_field(); 

是這樣的:

(this->*sip_field)(); 

或者,如果你想使用.代替->,那麼這樣的:

((*this).*sip_field)(); 

我寧願以前的語法。