8
votes

Classes de modèles et incluent des gardes en C ++

est-il sage d'avoir des gardes autour des classes de modèle?

Les classes de modèles ne sont pas censées être réparées à chaque fois que vous les référez avec une implémentation différente?

n.b dans Visual C ++ 2008 Je n'obtiens pas d'erreurs combinant les deux ...


0 commentaires

4 Réponses :


8
votes

Les définitions de modèles sont censées être analysées une fois (et des choses comme deux phases de la recherche de nom de phases sont ici de manière à ce que possible autant que possible puisse être donnée immédiatement sans avoir une instanciation). Les instanciations sont effectuées à l'aide de la structure de données interne construite à cette époque.

Les définitions de modèles sont généralement (c'est-à-dire si vous n'utilisez pas exporter ou fais quelque chose de spécial) dans les fichiers d'en-tête qui devraient avoir leur prédilection. L'ajout d'une définition de modèle est inutile mais pas nocif.


3 commentaires

Ajouter include toujours les gardes, s'y habituer, car c'est une bonne pratique.


Si vous effectuez un développement sur Win32, incluez #pragma une fois à chaque fois que vous utilisez Inclure des gardes.


+1 pour indiquer que les instanciations sont effectuées à l'aide de la structure de données interne construite au moment du premier balayage



13
votes

Vous avez besoin d'inclure des gardes. Considérons ce code:

t.h:2: error: redefinition of 'template<class T> void f(T)'
t.h:2: error: 'template<class T> void f(T)' previously declared here


2 commentaires

Strictement c'est une fonction de modèle plutôt qu'une classe de gabarits, mais le principe est identique - vous obtenez une erreur de définition multiple si vous déclarez la même classe deux fois, modèle ou non.


Voir ma réponse ici - Stackoverflow.com/Questtions/22595015/...



2
votes

Réponse courte: chaque unité que vous envisagez d'inclure plus d'une fois avec toutes les définitions qui devraient avoir une vedette. C'est avec ou sans modèles.


0 commentaires

2
votes

Pour répondre à votre première question: Oui, il est sage et obligatoire, d'inclure des gardes autour des classes de modèles. Ou plus strictement entourant tout le contenu de chaque fichier d'en-tête.

C'est le moyen d'obéir à la règle d'une définition lorsque vous avez des trucs dans des fichiers d'en-tête, de sorte que c'est partagé autour et toujours en sécurité. Il peut y avoir d'autres fichiers d'en-tête qui incluent la vôtre. Lorsque le compilateur compilait un fichier de module, il peut voir un #include de votre fichier d'en-tête plusieurs fois, mais les gardes d'emprunt à la seconde et les temps suivants pour que le compilateur ne voit que le contenu une fois. .

Cela n'a pas d'importance que le compilateur disparaisse quoi que ce soit; C'est son travail. Il vous suffit de fournir le contenu une fois et puis le compilateur l'a vu et peut-il y référer autant de fois que nécessaire.


0 commentaires