Le problème est que la recherche de nom ne trouve pas votre operator<<(ostream& os, const PAIR& r)
. Le code qui tente d'invoquer le operator<<
se trouve quelque part à l'intérieur du ostream_iterator<>
qui est lui-même à l'intérieur de l'espace de noms std
. La recherche de nom recherche la bonne fonction à l'intérieur de ostream_iterator<>
et l'espace de noms std
; La recherche dépendant de l'argument n'aide pas ici car les deux paramètres se trouvent également dans l'espace de noms std
. Donc, ma suggestion est (1) soit d'envelopper votre opérateur dans namespace std { }
, mais c'est UB, IIRC. Ou (2) créez une structure héritant de std::pair
pour définir un nouveau type dans votre espace de noms et utilisez l'ADL pour trouver votre operator<<()
.
MISE À JOUR:
Ma 3ème suggestion est d'utiliser un manipulateur personnalisé pour imprimer la paire.
Quant à ma 2ème suggestion, si vous pouvez utiliser C++ 11, héritant de std::pair
devrait être facile (non testé):
struct PAIR : std::pair
{
using std::pair::pair;
};
Si vous ne pouvez pas utiliser 11 C++, alors je suggère d'utiliser un manipulateur personnalisé.
Pouvez-vous expliquer comment votre dernière solution fonctionne? –
@ IvanZ.Siu: Voir ma mise à jour. – wilx