вызов перегруженного min (int &, int &) неоднозначен - PullRequest
3 голосов
/ 04 мая 2011

У меня возникла проблема с шаблоном. Этот код передан под vc6, но не под g ++ Кто-нибудь может сказать мне причину? спасибо.

#include<iostream>
using namespace std;

template<class T>
T min(T x, T y) {
    return (x < y ? x : y);
}

int main() {
    int i1 = 23, i2 = 15, i;
    float f1 = 23.04, f2 = 43.2, f;
    double d1 = 0.421342, d2 = 1.24342343, d;
    i = min(i1, i2);
    f = min(f1, f2);
    d = min(d1, d2);
    cout << "The smaller of " << i1 << " and " << i2 << " is " << i << endl;
    cout << "The smaller of " << f1 << " and " << f2 << " is " << f << endl;
    cout << "The smaller of " << d1 << " and " << d2 << " is " << d << endl;
}

"/ usr / bin / make" -f nbproject / Makefile-Debug.mk QMAKE = ПОДПРОЕКТЫ = .build-conf "/ usr / bin / make" -f nbproject / Makefile-Debug.mk dist / Debug / GNU-MacOSX / traincpp mkdir -p build / Debug / GNU-MacOSX rm -f build / Debug / GNU-MacOSX / newmain.o.d g ++ -c -g -MMD -MP -MF build / Debug / GNU-MacOSX / newmain.o.d -o строить / Debug / GNU-MacOSX / newmain.o newmain.cpp newmain.cpp: в функции 'int main ()': newmain.cpp: 13: ошибка: вызов перегруженного 'min (int &, int &)' неоднозначно newmain.cpp: 5: note: кандидаты: T min (T, T) [с T = INT] /usr/include/c++/4.2.1/bits/stl_algobase.h:182: примечание: const _Tp & std :: min (const _Tp &, const _Tp &) [с _Tp = int] newmain.cpp: 14: ошибка: вызов перегруженного 'min (float &, float &)' is неоднозначный newmain.cpp: 5: note: кандидаты: T min (T, T) [с T = плавать] /usr/include/c++/4.2.1/bits/stl_algobase.h:182: примечание: const _Tp & std :: min (const _Tp &, const _Tp &) [с _Tp = float] newmain.cpp: 15: ошибка: вызов перегруженного 'min (double &, double &) 'является неоднозначным newmain.cpp: 5: примечание: кандидаты: T min (T, T) [с T = double] /usr/include/c++/4.2.1/bits/stl_algobase.h:182: примечание: const _Tp & std :: min (const _Tp &, const _Tp &) [с _Tp = double] make [2]: * [build / Debug / GNU-MacOSX / newmain.o] Ошибка 1 сделать [1]: [.build-conf] Ошибка 2: ** [.build-impl] Ошибка 2

生成 失败 (值 值 2 , 总计 时间 : 623 毫秒)

Ответы [ 5 ]

13 голосов
/ 04 мая 2011

Это потому, что вы импортировали все пространство имен std , то есть no-no .Обратите внимание, что другие кандидаты являются шаблоном std::min.Удалите using namespace std; и импортируйте выбранные символы:

using std::cout;
using std::endl;

или уточните их:

std::cout << "The smaller of " << i1 << " and " << i2 << " is " << i << std::endl;
1 голос
/ 28 октября 2012

вместо написания std :: cout, вы можете использовать пространство имен std и создать свою функцию min в другом пространстве имен, скажем, abc ... так что теперь, когда вы вызываете свою функцию min, просто напишите abc :: min .. this должен решить вашу проблему.

1 голос
/ 04 мая 2011

Ваше включение iostream, по-видимому, также вызывает стандартный вызов min, и компилятор не может определить, хотите ли вы стандартный (из-за вашего using namespace) или ваш собственный. Просто удалите свой min и используйте версию стандартной библиотеки.

1 голос
/ 04 мая 2011

Возможно, у вас уже есть определение для min () в g ++.

0 голосов
/ 31 марта 2018

Функция swap () уже существует в iostream.Следовательно, он конфликтует с вашей функцией swap () .Возможно, вам придется указать, какой swap () вы хотите использовать, или изменить имя вашей функции подкачки, например swap1 (), swap2 () и т. Д. Вы можете изменить любую букву на UPPERCASE вашей функции подкачки, например: Swap () это может решить проблему без удаления using namespace std;

, в противном случае просто удалите using namespace std' и введите

using std :: cout;
using std :: endl;

ИЛИ напишите код вроде -

std :: cout << "After swapping - a = " << a << ", b = " << b << std :: endl;

Вот и все.Спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...