我正在尝试使用带有void函数的c ++模板泛型
代码:
#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 :(得分:3)
问题是using namespace std;
。您几乎不应该在代码中的任何地方使用 行。一个好方法是改为质量所有std
名称,即写std::cout << "Swapper!" << std::endl;
而不是cout << "Swapper!" << endl;
。
在这种特殊情况下,您自己的swap
功能与您通过std::swap
间接获得的<iostream>
冲突。虽然std::swap
<algorithm>
和<utility>
中仅存在using namespace std;
保证,但允许所有C ++标准标头引入任何其他C ++标准标头。
因此,一旦您包含任何标准标头,std
就会在[[year, month, day], ...]
中与所有名称产生潜在冲突。
答案 1 :(得分:2)
您应该删除using namespace std;
,因为此命名空间已包含名为swap
的函数,并且编译器不知道选择哪个。说实话,你自己并不需要自己编写这样的功能,它已经为你完成了。
另一种方法是将您的函数重命名为swap
以外的其他内容。