Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

g++, question de syntaxe

7 réponses
Avatar
news
Bonjour,

J'ai repris le code d'une bibliotheque qui compilait sans warning sous
g++ (versions 2.95 a 3.3, pas teste la 3.4).
Et sous g++ 4.0.2, j'ai carrement une erreur.

exemple de code :
class A
{
typename A B;
class C
{
friend class B;
}
}

Le compilateur rale parce que B est un nom defini par typename.
(error: using typedef-name 'A::B' after 'class').

Est-ce normal?

J'ai simplifie, mais ici, on voit pas trop l'interet d'un typename, mais
dans le code reel, c'est qqchose comme

template <class c1, class c2, class c3, class c4>
class A
{
typename A<c1,c2,c3,c4> B;
...


Quelle est la bonne syntaxe pour le friend ensuite:
- friend class A<c1,c2,c3,c4>;
ou - friend class A; ?

Les 2 semblent fonctionner, mais je prefererais eviter que g++ 4.0.3 me
jette a cause des versions precentes trop laxistes.

Merci d'avance.

7 réponses

Avatar
Jean-Marc Bourguet
news writes:

Bonjour,

J'ai repris le code d'une bibliotheque qui compilait sans warning sous g++
(versions 2.95 a 3.3, pas teste la 3.4).
Et sous g++ 4.0.2, j'ai carrement une erreur.

exemple de code :
class A
{
typename A B;


Tu es sur que c'est bien typename et pas typedef

class C
{
friend class B;
}
}


Et qu'il n'y avait pas des ; a la fin des definitions des classes?


Le compilateur rale parce que B est un nom defini par typename.
(error: using typedef-name 'A::B' after 'class').

Est-ce normal?


A mon avis, oui.

J'ai simplifie, mais ici, on voit pas trop l'interet d'un typename, mais
dans le code reel, c'est qqchose comme

template <class c1, class c2, class c3, class c4>
class A
{
typename A<c1,c2,c3,c4> B;


A nouveau je suppose qu'il s'agissait d'un typedef.

...


Quelle est la bonne syntaxe pour le friend ensuite:
- friend class A<c1,c2,c3,c4>;
ou - friend class A; ?


Ca depend ce que tu veux accepter comme friend. La premier forme ne
prend qu'une instanciation, la deuxieme toutes.

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Avatar
news
Jean-Marc Bourguet wrote:
news writes:


Bonjour,

J'ai repris le code d'une bibliotheque qui compilait sans warning sous g++
(versions 2.95 a 3.3, pas teste la 3.4).
Et sous g++ 4.0.2, j'ai carrement une erreur.

exemple de code :
class A
{
typename A B;



Tu es sur que c'est bien typename et pas typedef


oui bien sur, c'est typedef.
(j'ai pris un reflexe conditionne a supprimer les typenames implicites).

class C
{
friend class B;
}
}



Et qu'il n'y avait pas des ; a la fin des definitions des classes?


si

Le compilateur rale parce que B est un nom defini par typename.
(error: using typedef-name 'A::B' after 'class').

Est-ce normal?



A mon avis, oui.


J'ai simplifie, mais ici, on voit pas trop l'interet d'un typename, mais
dans le code reel, c'est qqchose comme

template <class c1, class c2, class c3, class c4>
class A
{
typename A<c1,c2,c3,c4> B;



A nouveau je suppose qu'il s'agissait d'un typedef.


exact


...


Quelle est la bonne syntaxe pour le friend ensuite:
- friend class A<c1,c2,c3,c4>;
ou - friend class A; ?



Ca depend ce que tu veux accepter comme friend. La premier forme ne
prend qu'une instanciation, la deuxieme toutes.


Dans mon cas ce sera le premier je pense.

Merci beaucoup.


Avatar
Franck Branjonneau
Jean-Marc Bourguet écrivait:

news writes:

class A
{
typename A B;


Tu es sur que c'est bien typename et pas typedef

class C
{
friend class B;
}
}


Et qu'il n'y avait pas des ; a la fin des definitions des classes?

J'ai simplifie, mais ici, on voit pas trop l'interet d'un typename, mais
dans le code reel, c'est qqchose comme

template <class c1, class c2, class c3, class c4>
class A
{
typename A<c1,c2,c3,c4> B;


A nouveau je suppose qu'il s'agissait d'un typedef.

...


Quelle est la bonne syntaxe pour le friend ensuite:
- friend class A<c1,c2,c3,c4>;
ou - friend class A; ?


Ca depend ce que tu veux accepter comme friend. La premier forme ne
prend qu'une instanciation, la deuxieme toutes.


Dans le contexte, class A<c1,c2,c3,c4> et class A ne sont-ils pas
synonymes ?

--
Franck Branjonneau


Avatar
Jean-Marc Bourguet
Franck Branjonneau writes:

Jean-Marc Bourguet écrivait:

news writes:

class A
{
typename A B;


Tu es sur que c'est bien typename et pas typedef

class C
{
friend class B;
}
}


Et qu'il n'y avait pas des ; a la fin des definitions des classes?

J'ai simplifie, mais ici, on voit pas trop l'interet d'un typename, mais
dans le code reel, c'est qqchose comme

template <class c1, class c2, class c3, class c4>
class A
{
typename A<c1,c2,c3,c4> B;


A nouveau je suppose qu'il s'agissait d'un typedef.

...


Quelle est la bonne syntaxe pour le friend ensuite:
- friend class A<c1,c2,c3,c4>;
ou - friend class A; ?


Ca depend ce que tu veux accepter comme friend. La premier forme ne
prend qu'une instanciation, la deuxieme toutes.


Dans le contexte, class A<c1,c2,c3,c4> et class A ne sont-ils pas
synonymes ?


Ce serait pas impossible. Mais avoir une classe friend d'elle-meme me
semble bizarre; tellement bizarre que j'ai lu autrechose que ce qui
etait ecrit et qu'il me semble qu'il y a des chances pour que j'ai lu
ce que le posteur voulait ecrire...

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org



Avatar
news
Jean-Marc Bourguet wrote:
Dans le contexte, class A<c1,c2,c3,c4> et class A ne sont-ils pas
synonymes ?



Ce serait pas impossible. Mais avoir une classe friend d'elle-meme me
semble bizarre; tellement bizarre que j'ai lu autrechose que ce qui
etait ecrit et qu'il me semble qu'il y a des chances pour que j'ai lu
ce que le posteur voulait ecrire...


Je ne suis pas l'auteur de ce code, mais ce que j'en ai compris c'est
que la classe A devait pouvoir acceder en temps qu'amie a la class A::C.
Comme A est declaree en temps que template, est-ce que la classe C en
herite aussi?
Si on declare friend class A dans C, est-ce que ce sera equivalent a
friend class A<c1,c2,c3,c4> ??
Je dois dire que je n'ai pas trouve de vrai reponse dans le stroustrup...


Avatar
Jean-Marc Bourguet
news writes:

Jean-Marc Bourguet wrote:
Dans le contexte, class A<c1,c2,c3,c4> et class A ne sont-ils pas
synonymes ?
Ce serait pas impossible. Mais avoir une classe friend d'elle-meme me

semble bizarre; tellement bizarre que j'ai lu autrechose que ce qui
etait ecrit et qu'il me semble qu'il y a des chances pour que j'ai lu
ce que le posteur voulait ecrire...


Je ne suis pas l'auteur de ce code, mais ce que j'en ai compris c'est que
la classe A devait pouvoir acceder en temps qu'amie a la class A::C.
Comme A est declaree en temps que template, est-ce que la classe C en
herite aussi?
Si on declare friend class A dans C, est-ce que ce sera equivalent a friend
class A<c1,c2,c3,c4> ??
Je dois dire que je n'ai pas trouve de vrai reponse dans le stroustrup...


Donne un exemple complet de ce que tu veux, j'ai l'impression que je
suis perdu.

A+
--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org



Avatar
news
Jean-Marc Bourguet wrote:
Je ne suis pas l'auteur de ce code, mais ce que j'en ai compris c'est que
la classe A devait pouvoir acceder en temps qu'amie a la class A::C.
Comme A est declaree en temps que template, est-ce que la classe C en
herite aussi?
Si on declare friend class A dans C, est-ce que ce sera equivalent a friend
class A<c1,c2,c3,c4> ??
Je dois dire que je n'ai pas trouve de vrai reponse dans le stroustrup...



Donne un exemple complet de ce que tu veux, j'ai l'impression que je
suis perdu.

A+



A priori, la premiere reponse m'a ete donnee au premier exemple.
Le code dont je parle definit un conteneur (classe A) et la classe C
definit l'iterateur associe.

Apparemment mon predecesseur a du penser qu'un friend etait necessaire,
mais en regardant mieux le code, il est inutile puisque tout passe par
l'operateur *. Je l'ai donc enleve.