2 votes

Recherche du nom d'une fonction amie dans une classe locale

Compilation des éléments suivants :

void bar() { /* ... */ }

void foo()
{
    struct MyStruct
    {
        friend void bar();
    };
}

int main()
{
    //..
}

entraîne l'erreur :

error : déclaration d'ami 'void bar()' dans une classe locale sans déclaration préalable

Pourquoi la recherche de nom échoue-t-elle ? Comment puis-je le réparer ?

2voto

Dave Points 10916

Vous ne pouvez pas accéder à une classe locale en dehors de son périmètre d'inclusion, même si vous êtes un ami, car The name of a local class is local to its enclosing scope - §9.8/1.


Cependant, si vous voulez simplement qu'il compile, dites-lui explicitement de regarder dans la portée globale...

friend void ::bar();

*Cela corrige le problème dans VS mais pas dans GCC pour une raison quelconque.

§11.3/11 (merci jrok)

Si une déclaration friend apparaît dans une classe locale (9.8) et que le nom spécifié est un nom non qualifié, une antérieure est recherchée sans prendre en compte les portées qui sont en dehors de la portée non-classe la plus interne.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X