2011-08-19 21 views
2

代碼:錯誤:沒有上下文類型信息的重載函數的地址

class que { 
public: 
    que operator++(int) {} // 1 
    que &operator++() {} 
    que &operator+=(int n) { 
     que& (que::*go)(); 
     go = 0; if(n > 0) go = &que::operator++ ; // 2 
     //go = (n > 0) ? (&que::operator++) : 0 ; // 3 
    } 
}; 

int main() { 
    que iter; 
    iter += 3; 
    return 0; 
} 

我想通過3線,以取代2號線(「如果」語句「?」)。
如果我取消註釋3,編譯器會給我一個錯誤。
如果我刪除第1行,那麼第3行的作品。
問題是:編譯器想從我那裏得到什麼
錯誤:錯誤:GCC-4.5.2

+0

你得到的錯誤信息是什麼? –

+0

錯誤:沒有上下文類型信息的重載函數的地址 – all

+0

爲什麼你需要在這裏使用函數指針?爲什麼不重複調用'operator ++'? –

回答

6

error: address of overloaded function with no contextual type information

有兩個與operator++名稱兩個功能(這是該消息的「重載的函數」位:無上下文類型的信息
編譯重載函數的地址),你需要指定你想要哪一個(這就是「情境類型信息」之一):

n > 0 ? (que& (que::*)())&que::operator++ : 0 

你必須要考慮的是,上述子表達式是獨立於封閉充分表達,分配給go。所以它必須是正確的,即它不能使用go類型來選擇正確的重載,因爲它不是這個特定子表達式的一部分。

+0

我認爲它可以從「去」聲明中獲得此信息。 – all

+0

@all你說得對,我做了一個更正。 –

相關問題