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

'friend' et classes imbriquées : bug ?

6 réponses
Avatar
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/

6 réponses

Avatar
Jean-Sebastien Mouret
Vincent Richard writes:

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); }



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); }



private:

class A 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().


};

int main()
{
B b;
}

[...]


Merci d'avance pour vos réponses.



en espérant que ca aide...


--

"creating the future" (c) framfab

Avatar
Jean-Sebastien Mouret
Vincent Richard writes:

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;


quick and dirty:

typedef class A 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;
}

[...]


--

"creating the future" (c) framfab

Avatar
Vincent Richard

class B
{
friend class A;
friend class A::A1;


quick and dirty:

typedef class A A_;
friend class A_::A1;


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/


Avatar
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/

Avatar
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/


Avatar
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