无法编译

时间:2012-03-11 16:21:48

标签: c++

#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”,程序可以编译并运行良好。它出什么问题了? 非常感谢你

2 个答案:

答案 0 :(得分:8)

当您使用swapstd::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。