Qt5.3編譯錯誤——call of overloaded ‘max(int int)’is ambiguous

錯誤描述:

今天在使用Qt寫一個C++函數模板的測試程序的時候,編譯的時候,編譯的時候出現以下錯誤:ios

image

錯誤描述爲:在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,應該有解決辦法的,上網找了一下,原來是由於函數名衝突的問題,這裏我先說下解決方法。學習


解決方法:

  1. 調用時聲明名字空間,把max(a,b);改爲::max(a,b);前加::,避免衝突
  2. 改變函數名稱,把自定義的函數max改爲myMax或其它。

形成問題的緣由:

max函數與標準庫的std::max函數衝突。測試

看來Qt中已經有了標準的max()的函數了,我測試了一下,還真有這個函數。spa


問題深究:

從這個錯誤中,咱們知道本身寫的函數名容易和標準庫或其餘文件裏的函數衝突,那麼C++是怎麼處理函數名衝突的呢?這就用到了命名空間。3d

名稱空間是一項c++de 特性,是用來解決在編寫大型程序中不一樣文件(廠商)中相同變量名問題。​ 例如:就像我編寫的函數max和標準的max,爲了可以準確調用其中一個max()函數,咱們將這兩個函數分別放在不一樣在命名空間單元中。這樣就能夠用 "命名空間::函數名" 的方式準確調用所需函數。code

  • ::max();//調用的本身寫的max()
  • std::max();//調用的標準模板庫的max

咱們常常會使用 using namespace std; 其中的std是c++在標準命名空間。blog

要讓程序訪問std有如下四種方法:ci

  1. 將using namespace std;放在函數定義以前,讓文件中全部的函數都可以使用命名空間std中在元素。​
  2. 將using namespace std;放在特定在函數定義中,讓該函數可以使用命名空間std中元素。​
  3. 在特定函數中使用using std::cout; 這樣的編譯指令,讓該函數使用命名空間std中所指定在元素,如 cout。這種方法在好處是,防止本身定義的變量名與std中在元素名重複。​
  4. 徹底不使用編譯指令using,在須要使用std中元素時,使用前綴std::。

  經過上面的第4條,這個問題的解決方法還有一種,就是不使用 using namespace std; ,可是cout,cin等一些標準的庫函數就不能使用了,因此最好的辦法是修改函數名。

相關文章
相關標籤/搜索