'friend' et classes imbriquées : bug ?
Le
Vincent Richard
Bonjour,
J'ai un petit problème pour compiler le code suivant :
class A
{
public:
class A1
{
};
};
class B
{
friend class A;
friend class A::A1;
public:
const class A& A() const { return (m_a); }
class A& A() { return (m_a); }
private:
class A m_a;
};
int main()
{
B b;
}
L'erreur indiquée par g++ (3.3.2) :
[vincent@sherlock tmp]$ g++ -o friend friend.cpp
friend.cpp:17: error: declaration of `const A& B::A() const'
friend.cpp:2: error: changes meaning of `A' from `class A'
Je précise qu'en enlevant la ligne "friend class A::A1;", le code compile
sans problème.
Alors, finalement, ce code est-il valide ? Si oui, est-ce un bug connu ; et
si non, quelle est mon erreur ?
J'ai quand même trouvé une parade à ce problème (déclaration d'une fonction
"intermédiaire" dans la classe A), mais j'aimerais bien savoir de quoi il
retourne
Merci d'avance pour vos réponses.
Vincent
--
vmime, une bibliothèque C++ sous licence GPL pour parser et générer
des messages au format MIME : http://www.sourceforge.net/projects/vmime/
J'ai un petit problème pour compiler le code suivant :
class A
{
public:
class A1
{
};
};
class B
{
friend class A;
friend class A::A1;
public:
const class A& A() const { return (m_a); }
class A& A() { return (m_a); }
private:
class A m_a;
};
int main()
{
B b;
}
L'erreur indiquée par g++ (3.3.2) :
[vincent@sherlock tmp]$ g++ -o friend friend.cpp
friend.cpp:17: error: declaration of `const A& B::A() const'
friend.cpp:2: error: changes meaning of `A' from `class A'
Je précise qu'en enlevant la ligne "friend class A::A1;", le code compile
sans problème.
Alors, finalement, ce code est-il valide ? Si oui, est-ce un bug connu ; et
si non, quelle est mon erreur ?
J'ai quand même trouvé une parade à ce problème (déclaration d'une fonction
"intermédiaire" dans la classe A), mais j'aimerais bien savoir de quoi il
retourne
Merci d'avance pour vos réponses.
Vincent
--
vmime, une bibliothèque C++ sous licence GPL pour parser et générer
des messages au format MIME : http://www.sourceforge.net/projects/vmime/

Poser une question


je suppose que ces deux lignes devraient être:
operator const A() const { return (m_a); }
operator A() { return (m_a); }
ou bien il faudrait donner des noms moins ambigus pour que le nom des
methodes ne collisionne pas avec celui de la classe.
par exemple (merci david):
const A& get_A() const { return (m_a); }
A& get_A() { return (m_a); }
dommage, cette ambiguité oblige à préciser `class' à chaque
utilisation de A en tant que type, pour ne pas confondre avec les
méthodes A().
en espérant que ca aide...
--
"creating the future" (c) framfab
quick and dirty:
typedef class A A_;
friend class A_::A1;
--
"creating the future" (c) framfab
En effet, cette solution fonctionne et est plus "propre" que celle
que j'avais trouvé, merci.
Mais ça ne m'explique toujours pas le pourquoi du problème...
Vincent
--
vmime, une bibliothèque C++ sous licence GPL pour parser et générer
des messages au format MIME : http://www.sourceforge.net/projects/vmime/
// friend class A::A1;
c'est implicite j'imagine, vu que A est déjà friend de B
donc A1 l'est aussi, mais peut-être me gourre-je ? :-)
compilé sans problème
Thierry
--
http://members.fortunecity.fr/tagada/
Oui, ce n'est pas implicite. En enlevant la deuxième ligne, seule "A" est
amie de la classe "B", et pas "A1".
Normal, le code que j'ai donné n'est pas complet (en particulier, pas
d'accès à un membre privé de B à partir de A::A1).
Vincent
--
vmime, une bibliothèque C++ sous licence GPL pour parser et générer
des messages au format MIME : http://www.sourceforge.net/projects/vmime/