2015-10-13 42 views
6
class A { 
    int f(int x, int j) { return 2;} 
    decltype(f)* p; 
}; 

給我的錯誤:Decltype的成員函數

error: decltype cannot resolve address of overloaded function 

我不明白爲什麼這個錯誤甚至說話的重載函數。同樣地,我想,也許我需要使用範圍操作進入功能:

class A { 
    int f(int x, int j) { return 2;} 
    decltype(A::f)* p; 
}; 

仍然給我的錯誤,但更清晰的描述:

error: invalid use of non-static member function 'int A::f(int, int)' 

爲什麼,我不是允許使用decltype來查找成員函數的類型?或者,將成員函數設置爲static可以消除這兩種情況下的錯誤。

+0

你使用的是什麼編譯器和編譯器版本? –

+0

@RichardChambers g ++ 4.8.1 – Silversonic

回答

5

你真正想要的是:

struct a { 
    int f(int x, int j) { return 2;} 
    decltype(&a::f) p; 
}; 

Live demo

由於f你指的是一個成員函數。推導的類型是:

int(a::*)(int, int) 

沒有&編譯器假設你正試圖調用的函數,而不提供參數給它。也許鏘的錯誤消息爲更清楚:

error: call to non-static member function without an object argument 
    decltype(a::f) p; 

如果你真的不希望你以後可以從<type_traits>申請std::remove_pointer_t指針類型。

+0

「編譯器假定您正在嘗試調用該函數而不提供參數。」這很奇怪,因爲它不會假設如果我傳遞decltype與普通函數的名稱。此外,我不知道類成員的類型前面有一個範圍操作符 - 我應該查看哪些內容才能更好地理解? – Silversonic

+0

@Silversonic「成員函數指針」我猜。請記住,任何非靜態成員函數都需要將'this'隱式地傳遞給它「,所以你可以看到'Return(Class :: *)(Arg1,Arg2,...)'爲'Return(Class * const ,Arg1,Arg2,...)'這就是爲什麼'Return(Class :: *)(Arg1,Arg2,...)'和'Return(*)(Arg1,Arg2,...)'不可能是相同的類型。 – Shoe