2015-09-13 48 views
1

我有兩個重載函數'func'。 func(int,int)在類外部定義,func(int)在裏面定義。如何從類的成員函數內部調用func(int,int)?爲什麼我不能用類函數重載一個非類函數?

#include <iostream> 
using namespace std; 

int func(int a, int b) 
{ return a+b;} 

class test 
{ 
    int a; 

    public: 
    int func(int); 
    int driver(); 
}; 

int test::func(int b) 
{ return b;} 

int test::driver() 
{ return func(10,20);} 

int main() 
{ 
    test A; 
    cout<<A.driver(); //ERROR: NO MATCHING FUNCTION TO CALL FUNC(INT,INT) 
    return 0; 
} 

回答

8
return ::func(10,20); 

使用::在名字前面是指在全局命名空間的樣子。然後它將找到全局func,而不是該類中包含的func

編輯:

func在班上不超載全球func本身,而是隱藏。當調用func時,查找開始時它會首先找到test::func,即使::func是更好的匹配項。更改名稱或刪除test::func將刪除查找遇到的第一個匹配項,並且它將繼續執行,直至找到下一個匹配項,即::func

至於爲什麼它不在全局命名空間中啓動,原因有很多。我不能爲那些設計它的人說話,但這些都是如果它改變就會發生的問題。

1:在命名空間中編寫代碼的任何人都必須限定名稱空間的每個名稱(std::coutcout)。如果不這樣做,可能會導致出現錯誤變量的靜默錯誤,這取決於上面的範圍中存在的錯誤。

2:非限定查找會發現不太可能與代碼相關的函數更快(函數在您調用它的位置旁邊更有可能與代碼相關,而不是與另一個頭文件中的相關)兩個名稱空間在你上面)。

3:函數會有相反的變量查找。我不能在函數內部指定局部範圍(void func() { int i; /*no*/func::i = 0;/*no*/}),因此查找變量仍然必須在封閉範圍內開始並向外運行。這兩個人朝相反的方向工作是沒有意義的。

+0

你能告訴我爲什麼編譯器不能自動查找全局範圍?對於非超載它確實 –

相關問題