#include <iostream>
using namespace std;
template < class T >
void swap (T& a, T& b)
{
T temp = a;
a = b;
b = temp;
}
int main ()
{
char a = 'a';
char b = 'b';
swap (a, b);
cout << "a = " << a << endl;
cout << "b = " << b << endl;
return 0;
}
代码无法在linux KDE命令行(gcc编译器)下编译。 但是,如果我将“using namespace std”更改为“使用std :: cout;使用std :: cin使用std :: endl”,程序可以编译并运行良好。它出什么问题了? 非常感谢你
答案 0 :(得分:8)
当您使用swap
将std::swap
带入全局命名空间时,您对std
的定义与using namespace
的现有定义相冲突。
请注意,当您尝试实例化模板时会发生冲突,您可以使用
::swap (a, b);
明确选择你的定义。
答案 1 :(得分:3)
以下是VC ++的说法:
error C2668: 'swap' : ambiguous call to overloaded function
1> c:\lisp\other\test_meth\test_meth.cpp(7): could be 'void swap<char>(T &,T &)'
1> with
1> [
1> T=char
1> ]
1> c:\program files (x86)\microsoft visual studio 10.0\vc\include\utility(100): or 'void std::swap<char>(_Ty &,_Ty &)'
1> with
1> [
1> _Ty=char
1> ]
1> while trying to match the argument list '(char, char)'
问题是:std命名空间已经包含模板函数swap。