Ci sono due cose da fare qui.
Il tuo primo problema è che hai incluso solo parte del messaggio di errore. Here is a link to the code being complied in gcc and clang, e uno dei messaggi di errore derivanti (per intero):
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) {
^
ci sono due candidati. Uno a main.cpp:6:3
(riga 6, carattere 3) e uno a algorithm:2579:1
(riga 2579, carattere 1).
Uno di quelli che hai scritto e uno di loro in #include <algorithm>
.
Uno dei file di intestazione incluso <algorithm>
senza che tu lo chieda. Le intestazioni standard sono autorizzate a farlo, tanto fastidioso quanto a volte.
Nel <algorithm>
è presente un modello di funzione std::min
. Poiché std::string
è un'istanza di una classe template in namespace std
, il modello di funzione std::min
si trova tramite un processo chiamato "argomento dipendente lookup" o "Koenig lookup". (i candidati con overloading delle funzioni vengono cercati localmente, e anche negli spazi dei nomi degli argomenti della funzione, e negli spazi dei nomi degli argomenti del template agli argomenti della funzione, e negli spazi dei nomi delle cose puntate dagli argomenti del funzione, ecc.)
Si trova anche la funzione locale min
, poiché si trova nello stesso spazio dei nomi del corpo di main
.
Entrambi sono ugualmente validi, e il compilatore non può decidere quale chiamare. Quindi genera un errore che ti dice questo.
Entrambi gcc e clang do error:
quindi una sequenza di note:
s. Solitamente all del note:
s dopo un errore sono importanti per la comprensione dell'errore.
Per risolvere questo problema, provare a chiamare ::min
(completamente qualificazione la chiamata), o rinominare la funzione di qualcos'altro, o fare la vostra versione un match migliore di std::min
(difficile, ma fattibile in alcuni casi), o chiamando (min)(a,b)
. L'ultimo blocco ricerca ADL/Koenig e blocca anche l'espansione delle macro (ad esempio, se alcuni SO hanno iniettato macro #define min
nelle intestazioni di sistema) (tramite @ 0x499602D2).
Che compilatore stai utilizzando? Sarebbe il tuo '' ha una funzione minima definita in esso. –
NathanOliver
Ho rinominato la classe e viene eseguita correttamente (http://ideone.com/ygVUcr). Non sono sicuro del motivo per cui 'min' è in conflitto con' std :: min'. – Mahesh
@Mahesh: hai riprodotto il problema senza rinominarlo? –