C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Erreur avec Visual Studio 2005

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
Philip K. Dick
Guest





PostPosted: Wed Apr 25, 2007 11:27 pm    Post subject: Erreur avec Visual Studio 2005 Reply with quote



Hello

J'ai le petit programme suivant qui compile nickel avec G++ sous Linux
mais pas avec Visual Studio 2005 :

// <virtual_beatle.h> ---------------------------

#ifndef _VIRTUAL_BEATLE
#define _VIRTUAL_BEATLE

#include <iostream>

namespace Beatles {

class Virtual_Beatle {
public:
virtual void hello();
friend std::ostream & operator << (std::ostream & os, Virtual_Beatle v);
};

};

#endif // _VIRTUAL_BEATLE

// <virtual_beatle.cpp> -------------------------

#include "virtual_beatle.h"

namespace Beatles {

void Virtual_Beatle::hello() {
std::cout << "Hello, I am an unknown Beatle" << std::endl;
}

std::ostream & operator << (std::ostream & os, Virtual_Beatle::Virtual_Beatle v) {
os << "Unknown Beatle";
return os;
};
};


Le compilo me sort :
"virtual_beatle.cpp(9) : error C2061: erreur de syntaxe : identificateur '{ctor}'"
"virtual_beatle.cpp(9) : error C2805: nombre de paramètres insuffisant pour l'opérateur binaire 'operator <<'"

Je ne vois pas où est l'erreur : l'exemple est tiré d'un bouquin
et je le répète avec G++ je n'ai aucun problème !

Merci pour toute aide !

PKD
Back to top
Michel Decima
Guest





PostPosted: Thu Apr 26, 2007 12:21 am    Post subject: Re: Erreur avec Visual Studio 2005 Reply with quote



Philip K. Dick wrote:

Quote:
namespace Beatles {

class Virtual_Beatle {
public:
virtual void hello();
friend std::ostream & operator << (std::ostream & os,
Virtual_Beatle v);
};
};

D'apres son nom, et la presence de la fonction virtuelle hello(), il
semblerait que la classe Virtual_Beatle est destinée a etre derivée
et utilisée de maniere polymorphe. Ca serait une bonne idee de lui
declarer un destructeur virtuel.
Concernant l'operateur de formattage, il prend en parametre un
Virtual_Beatle par valeur, ca va donner des resultats étranges avec des
classes derivées. Le bon prototype serait

std::ostream& operator << (std::ostream & os, Virtual_Beatle const& v );

(concernant le point-virgule, il est necessaire apres l'accolade qui
ferme la declaration de la classe, mais inutile pour le namespace).

Quote:
std::ostream & operator << (std::ostream & os, Virtual_Beatle::Virtual_Beatle v) {
os << "Unknown Beatle";
return os;
}

La notation Virtual_Beatle::Virtual_Beatle n'est pas correcte ici. Elle
devrait etre employee pour définir un constructeur, pas pour déclarer un
argument de fonction, et c'est bien ce que te signale le compilateur en
te distant qu'il y a une "erreur de syntaxe: identificateur {ctor}".

Si tu remplaces par

std::ostream&
operator << ( std::ostream & os,
Virtual_Beatle const& v)
{
os << "Unknown Beatle";
return os;
}

Ca devrait aller mieux.

Quote:
Je ne vois pas où est l'erreur : l'exemple est tiré d'un bouquin
et je le répète avec G++ je n'ai aucun problème !

Les bouquins, il y en a des bons et des mauvais. Dans le cas present, on
s'oriente vers la deuxieme option...
Et j'ai l'impression que g++ devrait protester sur le deuxieme parametre
de la definition de operator<<, parce que la notation employee ne
represente pas un type, mais je ne sais pas pourquoi il ne le fait
pas... (y a t'il un spécialiste de g++ dans la salle ?).

M.
Back to top
Philip K. Dick
Guest





PostPosted: Thu Apr 26, 2007 9:11 am    Post subject: Re: Erreur avec Visual Studio 2005 Reply with quote



Michel Decima wrote:
Quote:
Philip K. Dick wrote:

namespace Beatles {

class Virtual_Beatle {
public:
virtual void hello();
friend std::ostream & operator << (std::ostream & os,
Virtual_Beatle v);
};
};

D'apres son nom, et la presence de la fonction virtuelle hello(), il
semblerait que la classe Virtual_Beatle est destinée a etre derivée
et utilisée de maniere polymorphe. Ca serait une bonne idee de lui
declarer un destructeur virtuel.
Concernant l'operateur de formattage, il prend en parametre un
Virtual_Beatle par valeur, ca va donner des resultats étranges avec des
classes derivées. Le bon prototype serait

std::ostream& operator << (std::ostream & os, Virtual_Beatle const& v );

(concernant le point-virgule, il est necessaire apres l'accolade qui
ferme la declaration de la classe, mais inutile pour le namespace).

std::ostream & operator << (std::ostream & os,
Virtual_Beatle::Virtual_Beatle v) {
os << "Unknown Beatle";
return os;
}

La notation Virtual_Beatle::Virtual_Beatle n'est pas correcte ici. Elle
devrait etre employee pour définir un constructeur, pas pour déclarer un
argument de fonction, et c'est bien ce que te signale le compilateur en
te distant qu'il y a une "erreur de syntaxe: identificateur {ctor}".

Si tu remplaces par

std::ostream&
operator << ( std::ostream & os,
Virtual_Beatle const& v)
{
os << "Unknown Beatle";
return os;
}

Ca devrait aller mieux.

Je ne vois pas où est l'erreur : l'exemple est tiré d'un bouquin
et je le répète avec G++ je n'ai aucun problème !

Les bouquins, il y en a des bons et des mauvais. Dans le cas present, on
s'oriente vers la deuxieme option...
Et j'ai l'impression que g++ devrait protester sur le deuxieme parametre
de la definition de operator<<, parce que la notation employee ne
represente pas un type, mais je ne sais pas pourquoi il ne le fait
pas... (y a t'il un spécialiste de g++ dans la salle ?).

M.

Super, merci beaucoup Michel,


Franchement j'ai des progrès à faire ... et pour moi
il n'était pas évident que 'ctor' = constructor ;-)

PKD
Back to top
Philip K. Dick
Guest





PostPosted: Thu Apr 26, 2007 9:11 am    Post subject: Re: Erreur avec Visual Studio 2005 Reply with quote

Michel Decima wrote:
Quote:
Philip K. Dick wrote:

namespace Beatles {

class Virtual_Beatle {
public:
virtual void hello();
friend std::ostream & operator << (std::ostream & os,
Virtual_Beatle v);
};
};

D'apres son nom, et la presence de la fonction virtuelle hello(), il
semblerait que la classe Virtual_Beatle est destinée a etre derivée
et utilisée de maniere polymorphe. Ca serait une bonne idee de lui
declarer un destructeur virtuel.
Concernant l'operateur de formattage, il prend en parametre un
Virtual_Beatle par valeur, ca va donner des resultats étranges avec des
classes derivées. Le bon prototype serait

std::ostream& operator << (std::ostream & os, Virtual_Beatle const& v );

(concernant le point-virgule, il est necessaire apres l'accolade qui
ferme la declaration de la classe, mais inutile pour le namespace).

std::ostream & operator << (std::ostream & os,
Virtual_Beatle::Virtual_Beatle v) {
os << "Unknown Beatle";
return os;
}

La notation Virtual_Beatle::Virtual_Beatle n'est pas correcte ici. Elle
devrait etre employee pour définir un constructeur, pas pour déclarer un
argument de fonction, et c'est bien ce que te signale le compilateur en
te distant qu'il y a une "erreur de syntaxe: identificateur {ctor}".

Si tu remplaces par

std::ostream&
operator << ( std::ostream & os,
Virtual_Beatle const& v)
{
os << "Unknown Beatle";
return os;
}

Ca devrait aller mieux.

Je ne vois pas où est l'erreur : l'exemple est tiré d'un bouquin
et je le répète avec G++ je n'ai aucun problème !

Les bouquins, il y en a des bons et des mauvais. Dans le cas present, on
s'oriente vers la deuxieme option...
Et j'ai l'impression que g++ devrait protester sur le deuxieme parametre
de la definition de operator<<, parce que la notation employee ne
represente pas un type, mais je ne sais pas pourquoi il ne le fait
pas... (y a t'il un spécialiste de g++ dans la salle ?).

M.

Super, merci beaucoup Michel,


Franchement j'ai des progrès à faire ... et pour moi
il n'était pas évident que 'ctor' = constructor ;-)

PKD
Back to top
Philip K. Dick
Guest





PostPosted: Thu Apr 26, 2007 9:11 am    Post subject: Re: Erreur avec Visual Studio 2005 Reply with quote

Michel Decima wrote:
Quote:
Philip K. Dick wrote:

namespace Beatles {

class Virtual_Beatle {
public:
virtual void hello();
friend std::ostream & operator << (std::ostream & os,
Virtual_Beatle v);
};
};

D'apres son nom, et la presence de la fonction virtuelle hello(), il
semblerait que la classe Virtual_Beatle est destinée a etre derivée
et utilisée de maniere polymorphe. Ca serait une bonne idee de lui
declarer un destructeur virtuel.
Concernant l'operateur de formattage, il prend en parametre un
Virtual_Beatle par valeur, ca va donner des resultats étranges avec des
classes derivées. Le bon prototype serait

std::ostream& operator << (std::ostream & os, Virtual_Beatle const& v );

(concernant le point-virgule, il est necessaire apres l'accolade qui
ferme la declaration de la classe, mais inutile pour le namespace).

std::ostream & operator << (std::ostream & os,
Virtual_Beatle::Virtual_Beatle v) {
os << "Unknown Beatle";
return os;
}

La notation Virtual_Beatle::Virtual_Beatle n'est pas correcte ici. Elle
devrait etre employee pour définir un constructeur, pas pour déclarer un
argument de fonction, et c'est bien ce que te signale le compilateur en
te distant qu'il y a une "erreur de syntaxe: identificateur {ctor}".

Si tu remplaces par

std::ostream&
operator << ( std::ostream & os,
Virtual_Beatle const& v)
{
os << "Unknown Beatle";
return os;
}

Ca devrait aller mieux.

Je ne vois pas où est l'erreur : l'exemple est tiré d'un bouquin
et je le répète avec G++ je n'ai aucun problème !

Les bouquins, il y en a des bons et des mauvais. Dans le cas present, on
s'oriente vers la deuxieme option...
Et j'ai l'impression que g++ devrait protester sur le deuxieme parametre
de la definition de operator<<, parce que la notation employee ne
represente pas un type, mais je ne sais pas pourquoi il ne le fait
pas... (y a t'il un spécialiste de g++ dans la salle ?).

M.

Super, merci beaucoup Michel,


Franchement j'ai des progrès à faire ... et pour moi
il n'était pas évident que 'ctor' = constructor ;-)

PKD
Back to top
James Kanze
Guest





PostPosted: Thu Apr 26, 2007 9:11 am    Post subject: Re: Erreur avec Visual Studio 2005 Reply with quote

Philip K. Dick wrote:

Quote:
J'ai le petit programme suivant qui compile nickel avec G++ sous Linux
mais pas avec Visual Studio 2005 :

// <virtual_beatle.h> ---------------------------

#ifndef _VIRTUAL_BEATLE
#define _VIRTUAL_BEATLE

#include <iostream

namespace Beatles {

class Virtual_Beatle {
public:
virtual void hello();
friend std::ostream & operator << (std::ostream & os, Virtual_Beatle v);
};
};

#endif // _VIRTUAL_BEATLE

// <virtual_beatle.cpp> -------------------------

#include "virtual_beatle.h"

namespace Beatles {

void Virtual_Beatle::hello() {
std::cout << "Hello, I am an unknown Beatle" << std::endl;
}

std::ostream & operator << (std::ostream & os, Virtual_Beatle::Virtual_Beatle v) {

C'est quoi, Virtual_Beatle::Virtual_Beatle ?

Selon la norme, je crois que c'est bien un synonym pour
Virtual_Beatle, tout court, mais je ne suis pas 100% sûr, et
d'après le message d'erreur, il semble que VC++ le considère
comme le nom du constructeur.

Ce que tu veux, sans doute, c'est :

std::ostream&
operator<<(
std::ostream& dest,
Virtual_Beatle const& source )
{
}

C-à-d :

-- tu utilises le nom de la classe, et non quelque chose dans
la classe, comme nom du type,

-- tu passes le paramètre par référence -- sinon, il n'y a pas
de sens à utiliser les virtual, et

-- tu le passes par référence const, parce que tu n'as pas
l'intention de le modifier (j'espère).

Quote:
os << "Unknown Beatle";
return os;
};
};

Le compilo me sort :
"virtual_beatle.cpp(9) : error C2061: erreur de syntaxe : identificateur '{ctor}'"
"virtual_beatle.cpp(9) : error C2805: nombre de paramètres insuffisant pour l'opérateur binaire 'operator <<'"

Le deuxième erreur, c'est un « knock on » -- une conséquence
de la première.

Quote:
Je ne vois pas où est l'erreur : l'exemple est tiré d'un bouquin
et je le répète avec G++ je n'ai aucun problème !

Je serais intéressé à savoir quel bouquin. Si c'est le code
exact du bouquin, je te conseille de le jeter. En plus des
problèmes que j'ai cité ci-dessus :

-- l'utilisation d'un nom qui commence par _ et un majuscule
(c-à-d _VIRTUAL_BEATLE), même comme garde d'inclusion, a un
comportement indéfini, et

-- il faut sans doute un destructeur virtuel à Virtual_Beatle.

--
James Kanze (GABI Software) email:james.kanze (AT) gmail (DOT) com
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.