При получении ошибки с использованием функций шаблона в этой общей функции подкачки:
#include <iostream>
#include <complex>
using namespace std;
template <class T>
inline void swap(T& d, T& s)
{
T temp = d;
d = s;
s = temp;
}
int main()
{
int m = 5, n = 10;
double x = 5.3, y = 10.6;
complex<double> r(2.4, 3.5), s(3.4, 6.7);
cout << "inputs: " << m << "," << n << endl;
swap(m, n);
cout << "outputs: " << m << "," << n << endl;
cout << "double inputs: " << x << "," << y << endl;
swap(x, y);
cout << "double outputs: " << x << "," << y << endl;
cout << "complex inputs: " << r << "," << s << endl;
swap(r, s);
cout << "complex outputs: " << r << "," << s << endl;
return 0;
}
Кто-то может найти здесь ошибку? Я получаю сообщение об ошибке в трех вызывающих функциях:
Ошибка C2668 «подкачка»: неоднозначный вызов перегруженной функции
Я изменил формат std::, чтобы код:
#include <iostream>
#include <complex>
template <class T>
inline void swap(T& d, T& s)
{
T temp = d;
d = s;
s = temp;
}
int main()
{
int m = 5, n = 10;
double x = 5.3, y = 10.6;
std::complex<double> r(2.4, 3.5), s(3.4, 6.7);
std::cout << "inputs: " << m << "," << n << std::endl;
swap(m, n);
std::cout << "outputs: " << m << "," << n << std::endl;
std::cout << "double inputs: " << x << "," << y << std::endl;
swap(x, y);
std::cout << "double outputs: " << x << "," << y << std::endl;
std::cout << "complex inputs: " << r << "," << s << std::endl;
swap(r, s);
std::cout << "complex outputs: " << r << "," << s << std::endl;
return 0;
}
И теперь полная ошибка, которую я получил:
SwapFunction.cpp(55,14): error C2668: 'swap': ambiguous call to overloaded function
SwapFunction.cpp(32,13): message : could be 'void swap<std::complex<double>>(T &,T &)'
with
[
T=std::complex<double>
]
1>C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.28.29333\include\utility(102,19): message : or 'void std::swap<std::complex<double>,0>(_Ty &,_Ty &) noexcept(<expr>)' [found using argument-dependent lookup]
with
[
_Ty=std::complex<double>
]
Итак, я получаю только ошибку в функции вызова std::complex<double>, что можно сделать дальше?





using namespace std является вероятным виновником здесь, поскольку он втягивает std::swap в глобальное пространство имен.
Таким образом, вы можете либо удалить это и полностью определить соответствующие идентификаторы (рекомендуется), либо переименовать свою собственную функцию swap.
Спасибо, Пол, я перешел на формат std:: (теперь я вижу, что это плохая практика), теперь я получаю ошибку только в последнем вызове.
Какую ошибку вы получаете, пожалуйста (пожалуйста, добавьте полный текст к вашему вопросу). Это так же, как раньше?
Теперь я добавляю изменения, которые я сделал, и ошибка стала немного лучше, прежде чем я получил C2668 при вызове трех функций, теперь я получаю только одну
@BrunoMessias std::swap все еще можно найти через ADL. Либо назовите свою функцию полностью квалифицированной, например, ::swap(r, s);, либо просто переименуйте swap в my_swap, например.
@heapunderrun Спасибо! Я поменял на ::swap, проснулся
См.: Почему «используется пространство имен std;» считается плохой практикой? .