Tu dzieje się dwie rzeczy.
Twój pierwszy problem polega na tym, że zawierałeś tylko część komunikatu o błędzie. Here is a link to the code being complied in gcc and clang, a jeden z otrzymanych komunikatów o błędach (w całości):
main.cpp:13:34: error: call to 'min' is ambiguous
cout<<"minimum string is: "<<min(a,b)<<'\n';
^~~
/usr/include/c++/v1/algorithm:2579:1: note: candidate function [with _Tp = std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >]
min(const _Tp& __a, const _Tp& __b)
^
main.cpp:6:3: note: candidate function [with C = std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >]
C min(C a,C b) {
^
istnieją dwóch kandydatów. Jeden pod numerem main.cpp:6:3
(wiersz 6, znak 3) i jeden pod numerem algorithm:2579:1
(wiersz 2579, znak 1).
Jeden z nich napisał, a jeden z nich w #include <algorithm>
.
Jeden z plików nagłówkowych zawiera <algorithm>
bez pytania. Standardowe nagłówki mogą to robić, jak czasami denerwują.
W <algorithm>
znajduje się szablon funkcyjny . Ponieważ std::string
jest instancją klasy szablonów w namespace std
, szablon funkcji std::min
znajduje się w procesie zwanym "wyszukiwaniem zależnym od argumentu" lub "sprawdzeniem Koeniga". (kandydaci na przeciążenie funkcji są wyszukiwane lokalnie, a także w przestrzeni nazw argumentów funkcji, oraz w przestrzeni nazw argumentów szablonu dla argumentów funkcji oraz w przestrzeniach nazw rzeczy wskazywanych przez argumenty funkcja, itp.)
Twoja lokalna funkcja min
również została znaleziona, ponieważ znajduje się w tej samej przestrzeni nazw co treść main
.
Oba są równie dobrze dopasowane, a kompilator nie może zdecydować, do którego chce się zadzwonić. Więc generuje błąd informujący o tym.
Zarówno gcc, jak i clang mają error:
, a następnie sekwencję note:
s. Zwykle wszystkie s po błędzie są ważne dla zrozumienia błędu.
Aby rozwiązać ten problem, spróbuj dzwoniąc ::min
(w pełni rozmowę kwalifikacyjna) lub zmiana nazwy funkcji do czegoś innego, lub dokonać wersja lepsze dopasowanie niż std::min
(trudne, ale wykonalne w niektórych przypadkach), lub dzwoniąc (min)(a,b)
. Ostatni blokuje wyszukiwanie ADL/Koenig, a także blokuje rozszerzanie makr (na przykład, jeśli jakiś system operacyjny wstrzyknął do swoich nagłówków systemu makra #define min
) (przez @ 0x499602D2).
Jakiego kompilatora używasz? Zrobiłoby to twoje '' ma zdefiniowaną w nim funkcję min. –
NathanOliver
Zmieniłem nazwę klasy i działa ona poprawnie (http://ideone.com/ygVUcr). Nie wiem, dlaczego 'min' koliduje z' std :: min'. – Mahesh
@Mahesh: Czy odtworzyć problem bez zmiany jego nazwy? –