2012-03-11 2 views
-1
#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» на «using std :: cout; using std :: cin using std :: endl», программа может быть скомпилирована и выполнена хорошо. что с этим не так? Большое спасибоне удалось скомпилировать

+0

Какое * точное сообщение об ошибке, которое вы получаете? –

+2

Возможно, если вы упомянули, почему это «невозможно скомпилировать»? Как ... сообщение об ошибке? Мы не ясновидящие. –

+0

Просто используйте ** std :: cout ** вместо ** cout **, а также при использовании ** с использованием пространства имен std ** – DumbCoder

ответ

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)' 

Проблема заключается в том: станд пространство имен уже содержит функцию шаблона подкачки.

+0

Я понял, спасибо! – user1252725

7

Ваше определение swap конфликтует с уже существующим определением std::swap, когда вы приносите std в глобальном пространстве имен с использованием using namespace.

Обратите внимание, что происходит конфликт при попытке создать экземпляр шаблона, вы можете использовать

::swap (a, b); 

выбрать явно свое определение.

+0

Я понял. Большое спасибо! – user1252725

Смежные вопросы