今天在使用Qt寫一個C++函數模板的測試程序的時候,編譯的時候,編譯的時候出現以下錯誤:ios
錯誤描述爲:在main函數中,進行函數max()重載時,出現(ambiguous)含糊的,不明確的;引發歧義的使用;c++
由於第一次遇到這種錯誤,寫篇內容記念一下吧。函數
#include <iostream> using namespace std; template <typename T>//typename == class T max(T a,T b) { return a>b?a:b; } int main() { int a=1,b=2; cout<<max(a,b)<<endl; cout<<max(1,2)<<endl; cout<<max(2,3)<<endl; cout<<max(1.1f,2.2f)<<endl; cout<<max(1.11l,2.22l)<<endl; cout<<max('A','C')<<endl; //上面都是隱式的調用int,float.double.char類型的,而下面必須顯示的調用, //由於1是int類型的,而2.0是double類型的,此時,若是不明確指定數據類型,編譯器沒法識別。 cout<<max<int>(1,2.0)<<endl; }
單從代碼看,我看不出什麼錯誤,並且我記得當初學習C++模板的時候,也是這樣寫的,只不過,當初使用的IDE是VC6.0,難道環境不一樣。因此我把代碼貼到VC上,測試一下,完美的成功運行了。看來真是IDE不一樣的問題。但對於Qt,應該有解決辦法的,上網找了一下,原來是由於函數名衝突的問題,這裏我先說下解決方法。學習
max函數與標準庫的std::max函數衝突。測試
看來Qt中已經有了標準的max()的函數了,我測試了一下,還真有這個函數。spa
從這個錯誤中,咱們知道本身寫的函數名容易和標準庫或其餘文件裏的函數衝突,那麼C++是怎麼處理函數名衝突的呢?這就用到了命名空間。3d
名稱空間是一項c++de 特性,是用來解決在編寫大型程序中不一樣文件(廠商)中相同變量名問題。 例如:就像我編寫的函數max和標準的max,爲了可以準確調用其中一個max()函數,咱們將這兩個函數分別放在不一樣在命名空間單元中。這樣就能夠用 "命名空間::函數名" 的方式準確調用所需函數。code
咱們常常會使用 using namespace std;
其中的std是c++在標準命名空間。blog
要讓程序訪問std有如下四種方法:ci
經過上面的第4條,這個問題的解決方法還有一種,就是不使用 using namespace std;
,可是cout,cin等一些標準的庫函數就不能使用了,因此最好的辦法是修改函數名。