Я создаю шаблон, но получаю ошибку.
шаблон и основной (этот код в одном файле cpp):
#include <iostream>
using namespace std;
template<class T>
void swap(T& x, T& y);
template<class T>
void swap(T& x, T& y){
T temp = x;
x = y;
y = temp;
}
int main(){
int n1 = 10, n2 = 5;
cout << "number before swap: num1= " << n1 << " num2= " << n2 << endl;
swap(n1, n2);//compilation error
cout << "number after swap: num1= " << n1 << " num2= " << n2 << endl;
system("pause");
return 0;
}
ошибка:
Error 1 error C2668: 'std::swap' : ambiguous call to overloaded function
c:\projects\template\main.cpp 42 1 Template
2 IntelliSense: more than one instance of overloaded function "swap"matches the argument list:
function template "void swap(T &x, T &y)"function template "void std::swap(_Ty &, _Ty &)"argument types are: (int, int) c:\Projects\Template\main.cpp 43
2 Template
почему я получаю ошибку, я не понимаю, потому что все выглядит хорошо.
Спасибо за помощь.
Спасибо.
Ты используешь using namespace std;
, Из-за этого компилятор не может знать, является ли строка swap(n1, n2);
значит использовать std::swap
или ваш обычай swap
, Вы можете устранить неоднозначность, явно указав пространство имен для использования. Ты можешь использовать ::
указать глобальное пространство имен, где вы определили swap
функция. Пытаться:
int main()
{
int n1 = 10, n2 = 5;
cout << "number before swap: num1= " << n1 << " num2= " << n2 << endl;
::swap(n1, n2);
cout << "number after swap: num1= " << n1 << " num2= " << n2 << endl;
return 0;
}
Однако реальное решение здесь состоит в том, чтобы удалить using namespace std;
, Увидеть Вот для объяснения того, почему это плохая практика.
Если вы должны иметь using namespace std
объявив и реализовав собственную функцию подкачки, вы можете изменить имя функции, чтобы оно начиналось с заглавной буквы, Swap()
, Поскольку C ++ чувствителен к регистру, это позволит избежать столкновения и, следовательно, двусмысленности. Однако лучше использовать версию стандартной библиотеки.