Функция шаблона C++ не работает в Visual Studio 2019 [Ошибка 2668]

При получении ошибки с использованием функций шаблона в этой общей функции подкачки:

#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>, что можно сделать дальше?

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
397
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

using namespace std является вероятным виновником здесь, поскольку он втягивает std::swap в глобальное пространство имен.

Таким образом, вы можете либо удалить это и полностью определить соответствующие идентификаторы (рекомендуется), либо переименовать свою собственную функцию swap.

Спасибо, Пол, я перешел на формат std:: (теперь я вижу, что это плохая практика), теперь я получаю ошибку только в последнем вызове.

Bruno Messias 22.12.2020 14:21

Какую ошибку вы получаете, пожалуйста (пожалуйста, добавьте полный текст к вашему вопросу). Это так же, как раньше?

Paul Sanders 22.12.2020 14:23

Теперь я добавляю изменения, которые я сделал, и ошибка стала немного лучше, прежде чем я получил C2668 при вызове трех функций, теперь я получаю только одну

Bruno Messias 22.12.2020 14:35

@BrunoMessias std::swap все еще можно найти через ADL. Либо назовите свою функцию полностью квалифицированной, например, ::swap(r, s);, либо просто переименуйте swap в my_swap, например.

heap underrun 22.12.2020 14:47

@heapunderrun Спасибо! Я поменял на ::swap, проснулся

Bruno Messias 22.12.2020 14:55

Другие вопросы по теме