[英]Template class in c++?
我正在使用模板類來設置交換函數的數據類型。 在代碼中,如果我將函數名初始化為小寫字母,則會拋出一個錯誤call of overloaded 'swap(double&, double&) is ambiguous
錯誤call of overloaded 'swap(double&, double&) is ambiguous
但是當我將函數名初始化為大寫時,它可以正常工作。 如果有人能解釋我為什么會發生,將不勝感激。 這是我的代碼
#include<iostream>
using namespace std;
template <class T>
void swap(T &a,T &b)
{
T temp;
temp = a;
a = b;
b = temp;
}
int main()
{
double value1 = 2.44;
double value2 = 6.66;
cout<<"\tBefore swap \n";
cout<<"Value 1 = "<< value1 <<"\tValue 2 = " << value2 <<"\n";
swap(value1,value2);
cout<<"\tafter swap \n";
cout<<"Value 1 = "<< value1 <<"\tValue 2 = "<<value2;
}
代替
swap(value1,value2);
采用
::swap(value1,value2);
這將解決名稱空間和歧義性問題。
因為已經有一個標准的庫函數std::swap
http://www.cplusplus.com/reference/algorithm/swap/,所以您的編譯器可能不喜歡它? 您可以通過using namespace std;
更改swap
功能的名稱,因為std::swap
已經存在。
或者,您可以將其放在單獨的名稱空間中,並使用范圍解析運算符“ ::”將您的名稱與標准名稱區分。
這是在使用namespace std;
時發生的情況namespace std;
。 您可能需要更具體地使用:
using std::cout;
using std::endl;
using std::cin;
已經使用模板'swap'而不是'SWAP'定義了標准庫函數,它實際上位於std名稱空間下,但是由於您具有using namespace std行,因此它沒有std ::前綴。
如您所見,由於本例中可能發生名稱沖突,因此使用using名稱空間std並非總是一個好的選擇。 通常,除非存在真正的原因(名稱空間存在是出於某種原因)以防止名稱沖突,否則通常不應該使用using指令。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.