Sous Windows, il y a une fonction "OutputDebugString(const char*)" qui
envoit la chaîne en paramètre vers le debugger. Comme je désirais
pouvoir utiliser les formatages des streams C++ pour cette
fonctionnalité, j'ai écrit une classe RealDebugStream (qui fonctionne)
qui hérite de "std::ostream".
J'ai aussi écrit une classe DummyStream qui va agir comme un
"std::ostream", mais ne rien faire. Selon si l'on est en debug ou pas,
je fais un typedef vers la bonne classe. Si cela fonctionne bien sous
Visual C++ 6 et 7, cette classe ne compile pas avec g++ 3.4.1.
Le code suivant compile et fonctionne (enfin, c'est vite dit car il doit
justement ne rien faire :-) )
DummyStream s;
s << 123;
Par contre, celui-ci ne fonctionne pas (et c'est l'usage auquel je le
destine):
DummyStream() << 123;
J'ai l'erreur suivante:
no match for 'operator<<' in 'DummyStream() << 123'
candidates are: DummyStreamPoubelle& operator<<(DummyStreamPoubelle&,
const _T&) [with _T = int]
Il y a bien une seule fonction candidate. Par contre, si je mets tous mes
"DummyStream&" en "const" dans la fonction template, cela compile et
fonctionne.
Auriez-vous une explication pour ce comportement ?
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Fabien LE LEZ
On Thu, 17 Mar 2005 22:41:14 +0100, Roger That <fabsk+:
Il y a bien une seule fonction candidate. Par contre, si je mets tous mes "DummyStream&" en "const" dans la fonction template, cela compile et fonctionne.
Ton sujet est bien mal choisi...
En gros, tu veux écrire
typedef ... X; void f (X&);
f (X());
Hé ben c'est pas possible : un temporaire ne peut pas être passé en argument d'une fonction par référence non constante. Par contre, on peut appeler une fonction membre d'un temporaire, même si elle est non-const.
std::vector<X>().swap (v); // OK v.swap (std::vector<X>()); // erreur
-- ;-)
On Thu, 17 Mar 2005 22:41:14 +0100, Roger That <fabsk+news@free.fr>:
Il y a bien une seule fonction candidate. Par contre, si je mets tous mes
"DummyStream&" en "const" dans la fonction template, cela compile et
fonctionne.
Ton sujet est bien mal choisi...
En gros, tu veux écrire
typedef ... X;
void f (X&);
f (X());
Hé ben c'est pas possible : un temporaire ne peut pas être passé en
argument d'une fonction par référence non constante.
Par contre, on peut appeler une fonction membre d'un temporaire, même
si elle est non-const.
On Thu, 17 Mar 2005 22:41:14 +0100, Roger That <fabsk+:
Il y a bien une seule fonction candidate. Par contre, si je mets tous mes "DummyStream&" en "const" dans la fonction template, cela compile et fonctionne.
Ton sujet est bien mal choisi...
En gros, tu veux écrire
typedef ... X; void f (X&);
f (X());
Hé ben c'est pas possible : un temporaire ne peut pas être passé en argument d'une fonction par référence non constante. Par contre, on peut appeler une fonction membre d'un temporaire, même si elle est non-const.
std::vector<X>().swap (v); // OK v.swap (std::vector<X>()); // erreur
-- ;-)
Roger That
Le Thu, 17 Mar 2005 22:55:27 +0100, Fabien LE LEZ a écrit :
On Thu, 17 Mar 2005 22:41:14 +0100, Roger That <fabsk+:
Il y a bien une seule fonction candidate. Par contre, si je mets tous mes "DummyStream&" en "const" dans la fonction template, cela compile et fonctionne.
Ton sujet est bien mal choisi...
Je pensais que le problème était lié à un mauvais usage de ma part de l'opérateur << (ou peu-être alors à un mauvais usage d'un template). Je n'étais pas du tout sûr que le "const" était la source du problème.
C'était déjà mieux que de mettre comme sujet "quelque chose ne marche pas mais je ne sais pas où" :-)
En gros, tu veux écrire
typedef ... X; void f (X&);
f (X());
Hé ben c'est pas possible : un temporaire ne peut pas être passé en argument d'une fonction par référence non constante. Par contre, on peut appeler une fonction membre d'un temporaire, même si elle est non-const.
ok ok, tout est clair maintenant. Je ne connaissais pas cette subtilité. Merci beaucoup pour ta réponse très rapide.
Le Thu, 17 Mar 2005 22:55:27 +0100, Fabien LE LEZ a écrit :
On Thu, 17 Mar 2005 22:41:14 +0100, Roger That <fabsk+news@free.fr>:
Il y a bien une seule fonction candidate. Par contre, si je mets tous mes
"DummyStream&" en "const" dans la fonction template, cela compile et
fonctionne.
Ton sujet est bien mal choisi...
Je pensais que le problème était lié à un mauvais usage de ma part de
l'opérateur << (ou peu-être alors à un mauvais usage d'un template). Je
n'étais pas du tout sûr que le "const" était la source du problème.
C'était déjà mieux que de mettre comme sujet "quelque chose ne marche
pas mais je ne sais pas où" :-)
En gros, tu veux écrire
typedef ... X;
void f (X&);
f (X());
Hé ben c'est pas possible : un temporaire ne peut pas être passé en
argument d'une fonction par référence non constante. Par contre, on peut
appeler une fonction membre d'un temporaire, même si elle est non-const.
ok ok, tout est clair maintenant. Je ne connaissais pas cette
subtilité. Merci beaucoup pour ta réponse très rapide.
Le Thu, 17 Mar 2005 22:55:27 +0100, Fabien LE LEZ a écrit :
On Thu, 17 Mar 2005 22:41:14 +0100, Roger That <fabsk+:
Il y a bien une seule fonction candidate. Par contre, si je mets tous mes "DummyStream&" en "const" dans la fonction template, cela compile et fonctionne.
Ton sujet est bien mal choisi...
Je pensais que le problème était lié à un mauvais usage de ma part de l'opérateur << (ou peu-être alors à un mauvais usage d'un template). Je n'étais pas du tout sûr que le "const" était la source du problème.
C'était déjà mieux que de mettre comme sujet "quelque chose ne marche pas mais je ne sais pas où" :-)
En gros, tu veux écrire
typedef ... X; void f (X&);
f (X());
Hé ben c'est pas possible : un temporaire ne peut pas être passé en argument d'une fonction par référence non constante. Par contre, on peut appeler une fonction membre d'un temporaire, même si elle est non-const.
ok ok, tout est clair maintenant. Je ne connaissais pas cette subtilité. Merci beaucoup pour ta réponse très rapide.