est-il sage d'avoir des gardes autour des classes de modèle? P>
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? P>
n.b dans Visual C ++ 2008 Je n'obtiens pas d'erreurs combinant les deux ... p>
4 Réponses :
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. P>
Les définitions de modèles sont généralement (c'est-à-dire si vous n'utilisez pas exporter code> 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. P>
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 code> à 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
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
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/...
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. P>
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. P>
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 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. P> #include code> 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. . P>