[VS.NET] Une erreur de compilation incroyable!

Signaler
Messages postés
64
Date d'inscription
mardi 21 juin 2005
Statut
Membre
Dernière intervention
5 avril 2007
-
Messages postés
700
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
27 janvier 2009
-
Bonjour,

excusez moi mais je ne savais pas comment titrer mon message autrement.

Voilà là fameuse erreur qui se suffit à elle même:



<chemin>Mesfunc.cpp(72) : error C2665:
'afficheInfo' : none of the 2 overloads can convert parameter 2 from
type 'std::ostream'

<chemin>Mesfunc.h(14):
could be 'MaClasse *afficheInfo(MaClasse *,std::ostream)'

<chemin>Mesfunc.h(15):
or 'MaClasse *afficheInfo(const
char *,std::ostream)'

while trying to match the argument list '(MaClasse *, std::ostream)'



Alors je ne sais pas si vous voyez le truc, mais il ne veut pas
compiler parce qu'il ne peut pas convertir un std:ostream
en...std::ostream!!!!!!!!!!!!!!!



Alors là j'ai vraiment besoin qu'on m'explique!!

Merci

6 réponses

Messages postés
700
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
27 janvier 2009
4
salut,

il manque des informations !!

copie-colle ici tout ton fichier .h

quel est le type du premier parametre quand tu appelles afficheInfo à la ligne 72 de ton fichier mesfunc.cpp ??

copie colle tout l'appel.



a+
Messages postés
64
Date d'inscription
mardi 21 juin 2005
Statut
Membre
Dernière intervention
5 avril 2007

Oui je vois ce que tu veux dire mais non.

Regarde bien le texte de l'erreur!!

Il te dit ne pas pouvoir transtyper le deuxième paramètre depuis 'std::ostream' que les appels possibles sont ceux ci : 'MaClasse *afficheInfo(MaClasse *,std::ostream)' et 'MaClasse *afficheInfo(const char *,std::ostream)' alors que j'essai de faire appel avec ça: '(MaClasse *, std::ostream)'.

Voilà texto ce que l'erreur dit donc le compilo te dit lui même que mes arguments sont corrects!



Moi voilà tout de même la ligne 72 qui n'est pas un appel c'est le corps de la surcharge de la fonction.

MaClasse * afficheInfo(const char * sonsi,ostream sor)

{

MaClasse *mavar=NULL;

mavar=new MaClasse(sonsi);

afficheInfo( mavar,sor); //ligne 72

return mavar;

}



Ce qui est le plus hallucinant c'est que sous vc6 ça compile et execute
sans pro. Vraiment j'aimerai bien savoir où est mon erreur.
Messages postés
700
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
27 janvier 2009
4
l'erreur peut parait ambigue, c'est pour ca que je pense que c'est
mieux si tu copies-colle ici tout ton .h. A priori, si un des deux
compilateurs est buggé, c'est plus vc6 que vs7.

la a mon avis, pb avec les espaces de nommages...

dans ton .h tu ne doit pas avoir de using namespace std; et avoir

'MaClasse *afficheInfo(MaClasse *,std::ostream)' comme prototype.

dans ton .cpp, essaie de surchager avec std:: ou sans, d'enlever le using namespace std;



enfin bon, si ton but c'est pas de résoudre ton pb, mais de dire regardez c'est mysterieux ...

-> montre ta source !!!!!
Messages postés
700
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
27 janvier 2009
4
ha ben moi j'ai trouvé d'ou vient ton pb ;)

(qui n'aurait pas été trouvé sans le corps de ta fonctions).



le type ostream ne possede pas de constructeur de copie.

change le prototype de tes deux fonctions, et mets un passage par reference !!

MaClasse * afficheInfo(const char * sonsi,ostream& sor);

MaClasse * afficheInfo(MaClasse * sonsi,ostream& sor)



moi j'ai re obtenu ton erreur, et la suite du message m'a été utile:



error C2664: 'test' : impossible de convertir le paramètre 2 de 'std::ostream' en 'std::ostream'

Aucun constructeur de copie
n'est disponible pour class 'std::basic_ostream<_Elem,_Traits>'
ou le constructeur essaie d'exécuter une conversion non conforme en
référence non-__gc

with

[

_Elem=char,

_Traits=std::char_traits<char>

]



a+
Messages postés
64
Date d'inscription
mardi 21 juin 2005
Statut
Membre
Dernière intervention
5 avril 2007

Pourquoi moi j'ai pas la suite du message? il m'aime pas ou quoi?

Enfin bon apparement ça semble venir de là.

Mais pourquoi sous vc6 ça compile et ça marche?

vc7 est plus strict? mais là c'est même pas l'histoire si y'a pas de
constructeur par copie, ça ne devrait pas marcher quelque soit le
compilateur non?
Messages postés
700
Date d'inscription
mardi 30 décembre 2003
Statut
Membre
Dernière intervention
27 janvier 2009
4
-> vc6 est vraiment buggé.

Peut etre qu'il implemente une version de ostream qui possede un constructeur de copie, mais j'en doute.

A retenir : pour convertir un type en un autre (meme si ce sont les
memes), il faut un constructeur de copie ou un operateur d'affectation.



a+