Bonjour,
Je veux faire une classe représentant un arbre d'objets "XmlNode". Je
voulais dans ma classe "XmlNode" avoir une liste d'objets de ce type.
class XmlNode
{
std::list<XmlNode> m_NodeList;
};
Sauf que VC6 me jette, car dans la classe "std::list" il définit une
classe interne:
struct _Node {
_Nodeptr _Next, _Prev;
_Ty _Value;
};
"_Ty" est ici ma classe "XmlNode". Le compilateur n'est pas content:
'_Value' uses undefined class 'XmlNode'
g++ 3.3.1 n'a pas ce problème (avec sa propre implémentation de la STL),
mais je dois compiler avec VC6. Je crois que je suis fichu, je vais
devoir mettre comme membre de ma classe un pointeur sur liste :-(
Vous croyez que c'est de la faute à un compilateur obsolète ?
Merci de votre attention
Fabien
Bonjour,
Je veux faire une classe représentant un arbre d'objets "XmlNode". Je
voulais dans ma classe "XmlNode" avoir une liste d'objets de ce type.
class XmlNode
{
std::list<XmlNode> m_NodeList;
};
Sauf que VC6 me jette, car dans la classe "std::list" il définit une
classe interne:
struct _Node {
_Nodeptr _Next, _Prev;
_Ty _Value;
};
"_Ty" est ici ma classe "XmlNode". Le compilateur n'est pas content:
'_Value' uses undefined class 'XmlNode'
g++ 3.3.1 n'a pas ce problème (avec sa propre implémentation de la STL),
mais je dois compiler avec VC6. Je crois que je suis fichu, je vais
devoir mettre comme membre de ma classe un pointeur sur liste :-(
Vous croyez que c'est de la faute à un compilateur obsolète ?
Merci de votre attention
Fabien
Bonjour,
Je veux faire une classe représentant un arbre d'objets "XmlNode". Je
voulais dans ma classe "XmlNode" avoir une liste d'objets de ce type.
class XmlNode
{
std::list<XmlNode> m_NodeList;
};
Sauf que VC6 me jette, car dans la classe "std::list" il définit une
classe interne:
struct _Node {
_Nodeptr _Next, _Prev;
_Ty _Value;
};
"_Ty" est ici ma classe "XmlNode". Le compilateur n'est pas content:
'_Value' uses undefined class 'XmlNode'
g++ 3.3.1 n'a pas ce problème (avec sa propre implémentation de la STL),
mais je dois compiler avec VC6. Je crois que je suis fichu, je vais
devoir mettre comme membre de ma classe un pointeur sur liste :-(
Vous croyez que c'est de la faute à un compilateur obsolète ?
Merci de votre attention
Fabien
Fabien SK wrote:Bonjour,
Je veux faire une classe représentant un arbre d'objets "XmlNode". Je
voulais dans ma classe "XmlNode" avoir une liste d'objets de ce type.
class XmlNode
{
std::list<XmlNode> m_NodeList;
};
Sauf que VC6 me jette, car dans la classe "std::list" il définit une
classe interne:
struct _Node {
_Nodeptr _Next, _Prev;
_Ty _Value;
};
"_Ty" est ici ma classe "XmlNode". Le compilateur n'est pas content:
'_Value' uses undefined class 'XmlNode'
g++ 3.3.1 n'a pas ce problème (avec sa propre implémentation de la
STL), mais je dois compiler avec VC6. Je crois que je suis fichu, je
vais devoir mettre comme membre de ma classe un pointeur sur liste :-(
Vous croyez que c'est de la faute à un compilateur obsolète ?
Merci de votre attention
Fabien
Est ce que ce n'est pas le même problème que l'on a lorsqu'on veut faire
class XmlNode {
XmlNode Value; //Definition récursive non autorisée si non ptr
};
Pourquoi ne pas utiliser un composite pattern plus classique que celui
la ? Puisque XmlNode peut contenir des XmlNode ou un "XmlValue" (une
chaine?).
Un element est défini par
element ::= EmptyElemTag
| STag content ETag
EmptyElemTag ::= '<' Name (S Attribute)* S? '/>'
STag et ETag ::= '<...>'
et
content ::= (element | CharData | Reference | CDSect | PI | Comment)*
content correspond à ta liste et peut contenir element ou CharData
(ou > le reste)
ou bien utilise std::list<XmlNode * > ?
C'est finalement ce que j'ai fait. Mais c'est rajouter du code pour la
Fabien SK wrote:
Bonjour,
Je veux faire une classe représentant un arbre d'objets "XmlNode". Je
voulais dans ma classe "XmlNode" avoir une liste d'objets de ce type.
class XmlNode
{
std::list<XmlNode> m_NodeList;
};
Sauf que VC6 me jette, car dans la classe "std::list" il définit une
classe interne:
struct _Node {
_Nodeptr _Next, _Prev;
_Ty _Value;
};
"_Ty" est ici ma classe "XmlNode". Le compilateur n'est pas content:
'_Value' uses undefined class 'XmlNode'
g++ 3.3.1 n'a pas ce problème (avec sa propre implémentation de la
STL), mais je dois compiler avec VC6. Je crois que je suis fichu, je
vais devoir mettre comme membre de ma classe un pointeur sur liste :-(
Vous croyez que c'est de la faute à un compilateur obsolète ?
Merci de votre attention
Fabien
Est ce que ce n'est pas le même problème que l'on a lorsqu'on veut faire
class XmlNode {
XmlNode Value; //Definition récursive non autorisée si non ptr
};
Pourquoi ne pas utiliser un composite pattern plus classique que celui
la ? Puisque XmlNode peut contenir des XmlNode ou un "XmlValue" (une
chaine?).
Un element est défini par
element ::= EmptyElemTag
| STag content ETag
EmptyElemTag ::= '<' Name (S Attribute)* S? '/>'
STag et ETag ::= '<...>'
et
content ::= (element | CharData | Reference | CDSect | PI | Comment)*
content correspond à ta liste et peut contenir element ou CharData
(ou > le reste)
ou bien utilise std::list<XmlNode * > ?
C'est finalement ce que j'ai fait. Mais c'est rajouter du code pour la
Fabien SK wrote:Bonjour,
Je veux faire une classe représentant un arbre d'objets "XmlNode". Je
voulais dans ma classe "XmlNode" avoir une liste d'objets de ce type.
class XmlNode
{
std::list<XmlNode> m_NodeList;
};
Sauf que VC6 me jette, car dans la classe "std::list" il définit une
classe interne:
struct _Node {
_Nodeptr _Next, _Prev;
_Ty _Value;
};
"_Ty" est ici ma classe "XmlNode". Le compilateur n'est pas content:
'_Value' uses undefined class 'XmlNode'
g++ 3.3.1 n'a pas ce problème (avec sa propre implémentation de la
STL), mais je dois compiler avec VC6. Je crois que je suis fichu, je
vais devoir mettre comme membre de ma classe un pointeur sur liste :-(
Vous croyez que c'est de la faute à un compilateur obsolète ?
Merci de votre attention
Fabien
Est ce que ce n'est pas le même problème que l'on a lorsqu'on veut faire
class XmlNode {
XmlNode Value; //Definition récursive non autorisée si non ptr
};
Pourquoi ne pas utiliser un composite pattern plus classique que celui
la ? Puisque XmlNode peut contenir des XmlNode ou un "XmlValue" (une
chaine?).
Un element est défini par
element ::= EmptyElemTag
| STag content ETag
EmptyElemTag ::= '<' Name (S Attribute)* S? '/>'
STag et ETag ::= '<...>'
et
content ::= (element | CharData | Reference | CDSect | PI | Comment)*
content correspond à ta liste et peut contenir element ou CharData
(ou > le reste)
ou bien utilise std::list<XmlNode * > ?
C'est finalement ce que j'ai fait. Mais c'est rajouter du code pour la
class XmlNode
{
std::list<XmlNode> m_NodeList;
};
Sauf que VC6 me jette, car dans la classe "std::list" il définit une
classe interne:
g++ 3.3.1 n'a pas ce problème (avec sa propre implémentation de la STL),
mais je dois compiler avec VC6. Je crois que je suis fichu, je vais
devoir mettre comme membre de ma classe un pointeur sur liste :-(
Vous croyez que c'est de la faute à un compilateur obsolète ?
class XmlNode
{
std::list<XmlNode> m_NodeList;
};
Sauf que VC6 me jette, car dans la classe "std::list" il définit une
classe interne:
g++ 3.3.1 n'a pas ce problème (avec sa propre implémentation de la STL),
mais je dois compiler avec VC6. Je crois que je suis fichu, je vais
devoir mettre comme membre de ma classe un pointeur sur liste :-(
Vous croyez que c'est de la faute à un compilateur obsolète ?
class XmlNode
{
std::list<XmlNode> m_NodeList;
};
Sauf que VC6 me jette, car dans la classe "std::list" il définit une
classe interne:
g++ 3.3.1 n'a pas ce problème (avec sa propre implémentation de la STL),
mais je dois compiler avec VC6. Je crois que je suis fichu, je vais
devoir mettre comme membre de ma classe un pointeur sur liste :-(
Vous croyez que c'est de la faute à un compilateur obsolète ?
"Fabien SK" <fabsk+ schrieb im Newsbeitrag
news:3fb4e623$0$249$class XmlNode
{
std::list<XmlNode> m_NodeList;
};
Sauf que VC6 me jette, car dans la classe "std::list" il définit une
classe interne:
g++ 3.3.1 n'a pas ce problème (avec sa propre implémentation de la
STL), mais je dois compiler avec VC6. Je crois que je suis fichu, je
vais devoir mettre comme membre de ma classe un pointeur sur liste
:-( Vous croyez que c'est de la faute à un compilateur obsolète ?
Selon la norme (17.4.3.6), instancier un template de la librarie
standard est un comportement indéfini.
Dans ton cas, pour gcc, le comportement indéfini est de faire les
choses correctement...
"Fabien SK" <fabsk+news@free.fr> schrieb im Newsbeitrag
news:3fb4e623$0$249$626a54ce@news.free.fr...
class XmlNode
{
std::list<XmlNode> m_NodeList;
};
Sauf que VC6 me jette, car dans la classe "std::list" il définit une
classe interne:
g++ 3.3.1 n'a pas ce problème (avec sa propre implémentation de la
STL), mais je dois compiler avec VC6. Je crois que je suis fichu, je
vais devoir mettre comme membre de ma classe un pointeur sur liste
:-( Vous croyez que c'est de la faute à un compilateur obsolète ?
Selon la norme (17.4.3.6), instancier un template de la librarie
standard est un comportement indéfini.
Dans ton cas, pour gcc, le comportement indéfini est de faire les
choses correctement...
"Fabien SK" <fabsk+ schrieb im Newsbeitrag
news:3fb4e623$0$249$class XmlNode
{
std::list<XmlNode> m_NodeList;
};
Sauf que VC6 me jette, car dans la classe "std::list" il définit une
classe interne:
g++ 3.3.1 n'a pas ce problème (avec sa propre implémentation de la
STL), mais je dois compiler avec VC6. Je crois que je suis fichu, je
vais devoir mettre comme membre de ma classe un pointeur sur liste
:-( Vous croyez que c'est de la faute à un compilateur obsolète ?
Selon la norme (17.4.3.6), instancier un template de la librarie
standard est un comportement indéfini.
Dans ton cas, pour gcc, le comportement indéfini est de faire les
choses correctement...
"Bertrand Motuelle" wrote in message
news:<bp3gql$kn8$...Selon la norme (17.4.3.6), instancier un template de la librarie
standard est un comportement indéfini.
J'espère que non:-).
Mais je suis sûr que ce que tu voulais dire, c'est que l'instantiation
est un comportement indéfini *SI* les paramètres type sont des types
inachevés.
Dans ton cas, pour gcc, le comportement indéfini est de faire les
choses correctement...
Pour quelle définition de correctement ?
Quand il y a comportement indéfini, tous les compilateurs sont corrects, selon la norme.
Idéalement, en mode strict au moins, on amèreait un avertissement chaque
fois qu'il y a comportement indéfini. Dans la pratique, on ne va pas
l'avoir. Mais une erreur ou un avertissement est toujours le
comportement préféré dans de tels cas.
Sauf, évidemment, quand ce n'est pas le cas. Il y a un ou deux cas des
comportements indéfinis selon la norme où en fait, il y a un
comportement standard de facto. Donc, par exemple :
std::vector< char > data ;
int ch = std::cin.get() ;
while ( ch != EOF && isXXX( ch ) ) {
data.push_back( ch ) ; // Comportemment indéfini, peut core
}
L'idiome est trop répandu pour qu'un compilateur l'ignore. Un
compilateur qui réfuserait à le compiler, ou qui génèrerait du code qui
faisait autre chose que ce qu'on s'attend, se moque de ces utilisateurs.
De même :
(avec le compilateur invoqué avec -Dpthreads, -Dwinthreads, -Dnothreads,
ou quelque chose de semblable):
#define PASTE5( a, b, c, d, e ) a ## b ## c ## d ## e
#define DEPENDANT_FILE_NAME( dir, file ) PASTE5( <, dir, /, file, > #)
#include DEPENDANT_FILE_NAME( threadModel, Mutex.hh )
Selon la norme, si le résultat de ## n'est pas un token valid au
préprocesseur, le comportement est indéfini. Mais des choses semblables
à ceci est plus ou moins la façon standard (de facto) pour gerer des
dépendances de l'environement. En fait, ce qu'on s'attend, c'est
seulement que le résultat d'une séquence de ## soit un token valide, et
qu'il le soit dans le contexte où il apparaît. (En général, le résultat
<pthreads/Mutex.hh> n'est pas un token valide. Derrière un #include, en
revanche, si.)
Un compilateur qui réfuserait de le compiler, ou faisait autre chose que
ce à laquelle on s'attend, se moque de ces utilisateurs.
"Bertrand Motuelle" <tib.motuelle@laposte.net> wrote in message
news:<bp3gql$kn8$1@ulysses.news.tiscali.de>...
Selon la norme (17.4.3.6), instancier un template de la librarie
standard est un comportement indéfini.
J'espère que non:-).
Mais je suis sûr que ce que tu voulais dire, c'est que l'instantiation
est un comportement indéfini *SI* les paramètres type sont des types
inachevés.
Dans ton cas, pour gcc, le comportement indéfini est de faire les
choses correctement...
Pour quelle définition de correctement ?
Quand il y a comportement indéfini, tous les compilateurs sont corrects, selon la norme.
Idéalement, en mode strict au moins, on amèreait un avertissement chaque
fois qu'il y a comportement indéfini. Dans la pratique, on ne va pas
l'avoir. Mais une erreur ou un avertissement est toujours le
comportement préféré dans de tels cas.
Sauf, évidemment, quand ce n'est pas le cas. Il y a un ou deux cas des
comportements indéfinis selon la norme où en fait, il y a un
comportement standard de facto. Donc, par exemple :
std::vector< char > data ;
int ch = std::cin.get() ;
while ( ch != EOF && isXXX( ch ) ) {
data.push_back( ch ) ; // Comportemment indéfini, peut core
}
L'idiome est trop répandu pour qu'un compilateur l'ignore. Un
compilateur qui réfuserait à le compiler, ou qui génèrerait du code qui
faisait autre chose que ce qu'on s'attend, se moque de ces utilisateurs.
De même :
(avec le compilateur invoqué avec -Dpthreads, -Dwinthreads, -Dnothreads,
ou quelque chose de semblable):
#define PASTE5( a, b, c, d, e ) a ## b ## c ## d ## e
#define DEPENDANT_FILE_NAME( dir, file ) PASTE5( <, dir, /, file, > #)
#include DEPENDANT_FILE_NAME( threadModel, Mutex.hh )
Selon la norme, si le résultat de ## n'est pas un token valid au
préprocesseur, le comportement est indéfini. Mais des choses semblables
à ceci est plus ou moins la façon standard (de facto) pour gerer des
dépendances de l'environement. En fait, ce qu'on s'attend, c'est
seulement que le résultat d'une séquence de ## soit un token valide, et
qu'il le soit dans le contexte où il apparaît. (En général, le résultat
<pthreads/Mutex.hh> n'est pas un token valide. Derrière un #include, en
revanche, si.)
Un compilateur qui réfuserait de le compiler, ou faisait autre chose que
ce à laquelle on s'attend, se moque de ces utilisateurs.
"Bertrand Motuelle" wrote in message
news:<bp3gql$kn8$...Selon la norme (17.4.3.6), instancier un template de la librarie
standard est un comportement indéfini.
J'espère que non:-).
Mais je suis sûr que ce que tu voulais dire, c'est que l'instantiation
est un comportement indéfini *SI* les paramètres type sont des types
inachevés.
Dans ton cas, pour gcc, le comportement indéfini est de faire les
choses correctement...
Pour quelle définition de correctement ?
Quand il y a comportement indéfini, tous les compilateurs sont corrects, selon la norme.
Idéalement, en mode strict au moins, on amèreait un avertissement chaque
fois qu'il y a comportement indéfini. Dans la pratique, on ne va pas
l'avoir. Mais une erreur ou un avertissement est toujours le
comportement préféré dans de tels cas.
Sauf, évidemment, quand ce n'est pas le cas. Il y a un ou deux cas des
comportements indéfinis selon la norme où en fait, il y a un
comportement standard de facto. Donc, par exemple :
std::vector< char > data ;
int ch = std::cin.get() ;
while ( ch != EOF && isXXX( ch ) ) {
data.push_back( ch ) ; // Comportemment indéfini, peut core
}
L'idiome est trop répandu pour qu'un compilateur l'ignore. Un
compilateur qui réfuserait à le compiler, ou qui génèrerait du code qui
faisait autre chose que ce qu'on s'attend, se moque de ces utilisateurs.
De même :
(avec le compilateur invoqué avec -Dpthreads, -Dwinthreads, -Dnothreads,
ou quelque chose de semblable):
#define PASTE5( a, b, c, d, e ) a ## b ## c ## d ## e
#define DEPENDANT_FILE_NAME( dir, file ) PASTE5( <, dir, /, file, > #)
#include DEPENDANT_FILE_NAME( threadModel, Mutex.hh )
Selon la norme, si le résultat de ## n'est pas un token valid au
préprocesseur, le comportement est indéfini. Mais des choses semblables
à ceci est plus ou moins la façon standard (de facto) pour gerer des
dépendances de l'environement. En fait, ce qu'on s'attend, c'est
seulement que le résultat d'une séquence de ## soit un token valide, et
qu'il le soit dans le contexte où il apparaît. (En général, le résultat
<pthreads/Mutex.hh> n'est pas un token valide. Derrière un #include, en
revanche, si.)
Un compilateur qui réfuserait de le compiler, ou faisait autre chose que
ce à laquelle on s'attend, se moque de ces utilisateurs.
wrote:"Bertrand Motuelle" wrote in message
news:<bp3gql$kn8$...
Dans ton cas, pour gcc, le comportement indéfini est de faire les
choses correctement...
Pour quelle définition de correctement ?
Dans le sens ou on l´entend quand on travaille avec des listes
chainees.
Quand il y a comportement indéfini, tous les compilateurs sont
corrects, selon la norme. Idéalement, en mode strict au moins, on
amèreait un avertissement chaque fois qu'il y a comportement
indéfini. Dans la pratique, on ne va pas l'avoir. Mais une erreur ou
un avertissement est toujours le comportement préféré dans de tels
cas.
Sur ce point la, je ne suis pas sur. Si gcc implemente ses collections
de sorte qu´elles fonctionnent avec des types incomplets, je ne vois
pas de probleme (ok, si c´etait faisable un avertissement en mode
strict pourrait rendre service a l'utilisateur qui n'est pas au
courant). Surtout, il me semble ca peut ensuite donner des idees aux
autres vendeurs.
kanze@gabi-soft.fr wrote:
"Bertrand Motuelle" <tib.motuelle@laposte.net> wrote in message
news:<bp3gql$kn8$1@ulysses.news.tiscali.de>...
Dans ton cas, pour gcc, le comportement indéfini est de faire les
choses correctement...
Pour quelle définition de correctement ?
Dans le sens ou on l´entend quand on travaille avec des listes
chainees.
Quand il y a comportement indéfini, tous les compilateurs sont
corrects, selon la norme. Idéalement, en mode strict au moins, on
amèreait un avertissement chaque fois qu'il y a comportement
indéfini. Dans la pratique, on ne va pas l'avoir. Mais une erreur ou
un avertissement est toujours le comportement préféré dans de tels
cas.
Sur ce point la, je ne suis pas sur. Si gcc implemente ses collections
de sorte qu´elles fonctionnent avec des types incomplets, je ne vois
pas de probleme (ok, si c´etait faisable un avertissement en mode
strict pourrait rendre service a l'utilisateur qui n'est pas au
courant). Surtout, il me semble ca peut ensuite donner des idees aux
autres vendeurs.
wrote:"Bertrand Motuelle" wrote in message
news:<bp3gql$kn8$...
Dans ton cas, pour gcc, le comportement indéfini est de faire les
choses correctement...
Pour quelle définition de correctement ?
Dans le sens ou on l´entend quand on travaille avec des listes
chainees.
Quand il y a comportement indéfini, tous les compilateurs sont
corrects, selon la norme. Idéalement, en mode strict au moins, on
amèreait un avertissement chaque fois qu'il y a comportement
indéfini. Dans la pratique, on ne va pas l'avoir. Mais une erreur ou
un avertissement est toujours le comportement préféré dans de tels
cas.
Sur ce point la, je ne suis pas sur. Si gcc implemente ses collections
de sorte qu´elles fonctionnent avec des types incomplets, je ne vois
pas de probleme (ok, si c´etait faisable un avertissement en mode
strict pourrait rendre service a l'utilisateur qui n'est pas au
courant). Surtout, il me semble ca peut ensuite donner des idees aux
autres vendeurs.