8
votes

Espaces de noms, classes et fonctions gratuites - quand avez-vous besoin de noms entièrement qualifiés?

Dans mon exemple ci-dessous, pourquoi dois-je répondre pleinement au nom de la fonction libre dans le CPP pour éviter les erreurs de liaison et pourquoi fonctionne-t-elle pour la fonction de classe sans? Pouvez-vous expliquer la différence?

ctest.h: xxx CTEST. CPP: xxx

merci pour votre temps et votre aide.


2 commentaires

Notez que spécifier void comme argument, tandis que utile en C, est inutile et considéré comme un style mauvais en C ++: PARASHIFT.COM/C ++ - FAQ-LITE / NEWBIE.HTML # FAQ-29.4


@Ugo: J'ai édité ma question pour supprimer cette abomination. Merci d'avoir fait remarquer cela.


4 Réponses :


12
votes
namespace Test { 
    int FreeFunction(void);   // declare

    class CTest;              // declare
} 

int Test::FreeFunction(){return 0;} // define
class Test::CTest{            // define
};

int main(){}

3 commentaires

Est-il correct de dire que dans mon CTest.h, je définis la classe CTEST, mais je ne déclare que les fonctions membres de la CTEST?


Oui, tu as raison. De plus, une fonction peut être définie en ligne dans l'espace de noms ou être définie dans l'une de ses espaces de noms englobantes avec la qualification de nom complet.


Très belle réponse avec des exemples et une bonne explication. M'a aidé à comprendre le problème. Merci



1
votes

Si vous ne qualifiez pas la définition de la fonction libre, le compilateur ne sait pas à coup sûr de vous que vous souhaitez fournir une implémentation pour le test précédemment déclaré :: libre ou pour une fonction libre séparée dans l'espace de noms actuel.

D'autre part, il n'y a qu'un moyen de résoudre le nom ctest - en tant que définition de la classe de l'espace de noms de test. Ainsi, il n'est pas nécessaire de le qualifier pleinement.

Toutefois, si la résolution de nom de CTEST est ambiguë (par exemple, il existe également une autre classe CTEST dans l'espace de noms actuel), vous devrez également qualifier les déclarations de méthode.


0 commentaires

2
votes

tandis que freefly résolva à Test :: freefonction si vous le consultez ou appelez-le après avoir fourni le test ; ligne, aussi loin que la définition la fonction va, le compilateur n'a aucun moyen de savoir si vous définissez une entièrement nouvelle fonction / Code> En dehors de n'importe quel espace de noms, ou si vous définissez le test déjà déclaré :: libre . Le compilateur par défaut de penser que vous définissez une fonction entièrement nouvelle.

pour ctest :: ctest , cependant, vous êtes déjà faire référence à le test Test :: ctest , et puisqu'il n'y a pas de classe ou espace de noms ctest en dehors du test ESPACE NAMES, eh bien, la référence à ctest :: rien est sans ambiguïté. Il sait donc que les définitions de constructeur et de destructeur se rapportent à la classe d'espace de jeux ctest .

Je pense que c'est un petit prix à payer, de devoir écrire Test :: freefonction .

J'espère que cela vous aide!


0 commentaires

0
votes

Lors de la mise en œuvre d'une fonction, il est généralement préférable, je trouve, pour ouvrir l'espace de noms. N'oubliez pas que vous pouvez les réobnuler ...

// in Test.cpp
namespace Test
{
   int FreeFunction()
   {
       return 0;
   }
}


0 commentaires