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/
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/
thierry escola
Vincent Richard wrote:
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;
// 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
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) :
[ 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'
Thierry -- http://members.fortunecity.fr/tagada/
Vincent Richard wrote:
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;
// 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
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'
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;
// 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
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) :
[ 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'
Thierry -- http://members.fortunecity.fr/tagada/
Vincent Richard
class B { friend class A; friend class A::A1;
// 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 ? :-)
Oui, ce n'est pas implicite. En enlevant la deuxième ligne, seule "A" est amie de la classe "B", et pas "A1".
compilé sans problème
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/
class B
{
friend class A;
friend class A::A1;
// 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 ? :-)
Oui, ce n'est pas implicite. En enlevant la deuxième ligne, seule "A" est
amie de la classe "B", et pas "A1".
compilé sans problème
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/
// 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 ? :-)
Oui, ce n'est pas implicite. En enlevant la deuxième ligne, seule "A" est amie de la classe "B", et pas "A1".
compilé sans problème
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/
Gabriel Dos Reis
Vincent Richard writes:
| class B | { | friend class A; | friend class A::A1; | | public: | | const class A& A() const { return (m_a); } | class A& A() { return (m_a); }
[...]
| 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 ?
Non. Tu utilises deux fois le nom « A » (de manière non qualifiée) dans la définition de la class B avec des significations différentes. Cela est invalide.
Le plus simple est de définir un opérateur de conversion. Ou bien qualifier explicitement le A qui réfère à la class globale.
-- Gaby
Vincent Richard <chere-loque.MARRE-DE-LA-PUB@wanadoo.fr.invalid> writes:
| class B
| {
| friend class A;
| friend class A::A1;
|
| public:
|
| const class A& A() const { return (m_a); }
| class A& A() { return (m_a); }
[...]
| 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 ?
Non. Tu utilises deux fois le nom « A » (de manière non qualifiée)
dans la définition de la class B avec des significations
différentes. Cela est invalide.
Le plus simple est de définir un opérateur de conversion. Ou bien
qualifier explicitement le A qui réfère à la class globale.
| class B | { | friend class A; | friend class A::A1; | | public: | | const class A& A() const { return (m_a); } | class A& A() { return (m_a); }
[...]
| 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 ?
Non. Tu utilises deux fois le nom « A » (de manière non qualifiée) dans la définition de la class B avec des significations différentes. Cela est invalide.
Le plus simple est de définir un opérateur de conversion. Ou bien qualifier explicitement le A qui réfère à la class globale.