2016-02-27 66 views
0

我想使用C++模板仿製藥爲void功能,使用模板與空函數

代碼:

#include <iostream> 

using namespace std; 

template <typename T> 
inline void swap(T& x, T& y) 
{ 
    T temp = x; 
    x = y; 
    y = temp; 
} 

int main() 
{ 
    cout << "Swapper!" << endl; 
    int x, y; 
    cin >> x >> y; 
    swap(x, y); 
    cout << x << y; 
    cin.get(); 
    return 0; 
} 

但它給出了一個錯誤:

通話超載swap()含糊不清

如何刪除此錯誤?

+0

我認爲重複並沒有完全解決爲什麼'std :: swap'可能成爲一個問題,即使既沒有''也沒有''被包括在內。 –

回答

2

您應該刪除using namespace std;,因爲該名稱空間已經包含一個函數swap並且編譯器不知道選擇哪一個函數。說實話,你並不需要自己編寫這樣的函數,它已經爲你完成了。

另一種方法是將您的功能重命名爲swap以外的其他功能。

3

問題是using namespace std;。你幾乎不應該在你的代碼中使用這個行。一個好的方法是改爲只需質量所有的std名稱,即編寫std::cout << "Swapper!" << std::endl;而不是cout << "Swapper!" << endl;

在這種特殊情況下,您自己的swap功能與std::swap衝突,您通過<iostream>直接獲取該功能。雖然std::swap只有保證存在於<algorithm><utility>中,但所有C++標準頭文件都可以在任何其他C++標準頭文件中使用。

所以一旦你包括任何標準的頭,using namespace std;創建了std所有名潛在的衝突。