Когда я создаю шаблон, я пытаюсь использовать его, но получаю ошибку (C2668) и ошибку IntelliSense

Я создаю шаблон, но получаю ошибку.

шаблон и основной (этот код в одном файле 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

почему я получаю ошибку, я не понимаю, потому что все выглядит хорошо.
Спасибо за помощь.

Спасибо.

1

Решение

Ты используешь 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;, Увидеть Вот для объяснения того, почему это плохая практика.

5

Другие решения

Если вы должны иметь using namespace std объявив и реализовав собственную функцию подкачки, вы можете изменить имя функции, чтобы оно начиналось с заглавной буквы, Swap(), Поскольку C ++ чувствителен к регистру, это позволит избежать столкновения и, следовательно, двусмысленности. Однако лучше использовать версию стандартной библиотеки.

0

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector