Je ne sais pas quoi faire lorsque j'ai des espaces de noms imbriqués et des déclarations d'objets.
Je porte du code lié à une bibliothèque statique qui a quelques espaces de noms.
Exemple de ce dont je parle:
namespace ABC {
namespace XYZ {
//STUFF
}
}
Dans le code, que dois-je faire pour déclarer un objet qui se trouve dans l'espace de noms XYZ
?
si j'essaye:
XYZ::ClassA myobject;
ou:
ABC::XYZ::ClassA myobject;
ou:
ABC::ClassA myobject;
Je reçois
ne nomme pas de type
des erreurs, même si ClassA
existe définitivement.
Qu'est-ce qui est bon ici?
Cela dépend de l'espace de noms que vous êtes déjà:
Si vous n'êtes dans aucun espace de noms ou dans un autre espace de noms sans rapport, vous devez spécifier le chemin entier ABC::XYZ::ClassA
.
Si vous êtes dans ABC
, vous pouvez ignorer ABC
et écrire simplement XYZ::ClassA
.
De plus, il convient de mentionner que si vous souhaitez faire référence à une fonction qui ne se trouve pas dans un espace de noms (ou l'espace de noms "racine"), vous pouvez le préfixer par ::
:
Exemple:
int foo() { return 1; }
namespace ABC
{
double foo() { return 2.0; }
void bar()
{
foo(); //calls the double version
::foo(); //calls the int version
}
}
Si myobject
est déclaré dans cet espace de noms et que vous souhaitez le déclarer à nouveau (pour le définir), vous le faites en préfixant son nom, pas son type.
ClassA ABC::XYZ::myobject;
Si son type est également déclaré dans cet espace de noms, vous devez également préfixer le nom du type
ABC::XYZ::ClassA ABC::XYZ::myobject;
Il est rarement nécessaire de redéclarer un objet comme celui-ci. Souvent, la première déclaration d'un objet est également sa définition. Si vous souhaitez d'abord déclarer l'objet, vous devez le faire dans cet espace de noms. Ce qui suit déclare et définit "monobjet"
namespace ABC {
namespace XYZ {
ClassA myobject;
}
}
Si vous avez défini un objet comme celui-ci, vous vous y référez en disant ABC::XYZ
. Vous n'êtes pas obligé de "déclarer" cet objet d'une manière ou d'une autre pour l'utiliser localement
void f() {
ABC::XYZ::myobject = someValue;
// you *can* however use a using-declaration
using ABC::XYZ::myobject;
myobject = someValue;
}