Il problema è che la ricerca del nome non trova il tuo operator<<(ostream& os, const PAIR& r)
. Il codice che tenta di richiamare lo operator<<
si trova in qualche parte all'interno dello ostream_iterator<>
che si trova all'interno dello spazio dei nomi std
. La ricerca del nome cerca la funzione giusta all'interno di ostream_iterator<>
e dello spazio dei nomi std
; la ricerca dipendente dall'argomento non aiuta qui perché entrambi i parametri si trovano nello spazio dei nomi std
.
Quindi, il mio suggerimento è (1) di avvolgere il tuo operatore in namespace std { }
, ma questo è UB, IIRC. Oppure (2) creare una struct che eredita da std::pair
per definire un nuovo tipo nel proprio spazio dei nomi e utilizzare l'ADL per trovare il numero operator<<()
.
UPDATE:
mio terzo suggerimento è quello di utilizzare un manipolatore personalizzato per stampare la coppia.
quanto riguarda il mio secondo suggerimento, se è possibile utilizzare C++ 11, che eredita da std::pair
dovrebbe essere facile (non testata):
struct PAIR : std::pair
{
using std::pair::pair;
};
Se non è possibile utilizzare C++ 11, allora io suggerisco di usare un manipolatore personalizzato.
Puoi approfondire come funziona la tua soluzione successiva? –
@ IvanZ.Siu: vedere il mio aggiornamento. – wilx