Question

J'essaie de créer un nouveau projet .NET C ++ à partir de zéro. Je prévois de mélanger du code géré et non géré dans ce projet.

ce fil de discussion IDataObject: erreur de symbole ambigu répond à un problème rencontré à plusieurs reprises.

États du poste 4 & "Déplacer tout" en utilisant l'espace de noms XXXX "de .h à .cpp &";

cela semble être une bonne idée, mais maintenant, dans mes fichiers d'en-tête, je dois référencer des paramètres du .NET Framework tels que

.
void loadConfigurations(String^ pPathname);

Comment suis-je censé utiliser des instructions du fichier .cpp et utiliser les espaces de noms correspondants dans le fichier .h?

Était-ce utile?

La solution

C'est une bonne idée de toujours utiliser des noms complets dans les fichiers d'en-tête. Étant donné que l'instruction using affecte l'ensemble du code suivant indépendamment de #include, l'insertion d'une instruction <=> dans un fichier d'en-tête affecte toutes les personnes susceptibles d'inclure cet en-tête.

Vous devez donc modifier la déclaration de votre fonction dans votre fichier d'en-tête en:

void loadConfigurations(SomeNamespace::String^ pPathname);

où SomeNamespace est le nom de l'espace de nom que vous étiez auparavant <=>.

Autres conseils

Je ne connais pas grand chose à propos de .NET, ma réponse ne concerne donc que la partie non gérée de votre question. Personnellement, c’est l’une des principales raisons que j’évite, comme la peste & «Utiliser l’espace de nommage XXXX; &»; déclarations.

Je préfère simplement être explicite avec des espaces de noms tels que & "; std :: cout < < & "; Bonjour tout le monde &"; < < std :: endl; & ";

Ceci évite les collisions d’espace de noms et il n’ya jamais d’ambiguïté sur la provenance de quelque chose. De plus, lorsque vous faites quelque chose comme & "; Utilisez l’espace de nom std; &"; vous êtes en train de défaire ce que les espaces de noms vous donnent. Ils ont été conçus pour éviter les collisions. En les important dans le monde entier, vous invitez simplement les collisions à revenir.

C’est strictement une question d’opinion et de goût.

En ce qui concerne ce qu'il faut faire dans les en-têtes, je viens d'écrire des choses comme celle-ci: & "void f (const std :: string & amp; s); &";

Pour résoudre ce problème, je l'ai fait dans le fichier .h:

namespace TestClassNS
{
  class TestClass;
}

puis dans le fichier .cpp, j'inclue le fichier .h dans lequel TestClass se trouve et j'utilise namespaceTestClassNS.

Mon C ++ est rouillé, il peut donc y avoir un meilleur moyen.

Selon mon expérience, le seul espace de nom sur lequel vous devez faire attention est le système lui-même. C'est un peu ennuyeux que le plus commun, le plus important, soit l'endroit où vous rencontrez des problèmes, mais c'est la vie.

Vous pouvez au moins vous assurer que, si vous créez des classes managées, vos problèmes d'inclusion obtiendront un allègement à la barrière d'assemblage, contrairement aux problèmes liés aux fichiers d'en-tête pour les classes non managées.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top