web-dev-qa-db-fra.com

Espaces de noms imbriqués en C ++

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?

31
jDOG

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
  }
}
48
ereOn

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