Prenons l'exemple minimale suivante:Ordre de résolution de surcharge de l'opérateur impliquant temporaires
#include <iostream>
using namespace std;
class myostream : public ostream {
public:
myostream(ostream const &other) :
ostream(other.rdbuf())
{ }
};
int main() {
cout << "hello world" << endl;
myostream s(cout);
s << "hello world" << endl;
myostream(cout) << "hello world" << endl;
}
La sortie, à la fois sur g ++ et Visual C++, est
hello world
hello world
0x4012a4
La version qui écrit à un objet temporaire , myostream(cout)
, semble préférer l'opérateur membre ostream::operator<<(void *)
, au lieu de l'opérateur libre operator<<(ostream &, char *)
. Il semble faire une différence si l'objet a un nom ou non.
Pourquoi cela se produit-il? Et comment puis-je empêcher ce comportement?
Modifier: Pourquoi cela se produit-il maintenant à partir de diverses réponses? Quant à la façon d'éviter cela, ce qui suit semble appel:
class myostream : public ostream {
public:
// ...
myostream &operator<<(char const *str) {
std::operator<<(*this, str);
return *this;
}
};
Cependant, il en résulte toutes sortes d'ambiguïtés.
Vous pourriez envisager cette réponse à une autre question comme point de départ pour quelque chose c'est au moins semblable à ce que vous voulez réaliser: http://stackoverflow.com/questions/469696/what-is-your-most-useful-cc-snippet/470999#470999 Vous devrez ajouter des fonctionnalités à la classe accepter les modificateurs d'entrée (std :: hex, std :: endl ...), mais cela ne devrait pas être trop dur. –