2008-08-30 5 views
22

C++ semble être plutôt grincheux lors de la déclaration de modèles sur plusieurs fichiers. Plus spécifiquement, lorsque vous travaillez avec des classes modélisées, l'éditeur de liens attend toutes les définitions de méthode de la classe dans un seul fichier objet de compilateur. Lorsque vous prenez en compte les en-têtes, les autres déclarations, l'héritage, etc., les choses deviennent vraiment salissantes.Les modèles répartis sur plusieurs fichiers

Existe-t-il des conseils généraux ou des solutions de contournement pour l'organisation ou la redistribution de définitions de membres modélisées dans plusieurs fichiers?

Répondre

23

Existe-t-il des conseils généraux ou des solutions de contournement pour l'organisation ou la redistribution de définitions de membres sur plusieurs fichiers?

Oui; ne fais pas ça.

La spécification C++ permet un compilateur pour être en mesure de « voir » au point de instanciation, et (en raison de la complexité de toute mise en œuvre) la plupart des compilateurs conservent cette exigence l'ensemble du modèle (déclaration et définition). Le résultat est que #inclusion d'un en-tête de template doit également # inclure toute source nécessaire pour instancier le template.

La manière la plus simple de traiter cela est de tout vider dans l'en-tête, en ligne si possible, hors-ligne si nécessaire. Si vous considérez vraiment cela comme un affront inacceptable, une option courante consiste à diviser le modèle dans la paire habituelle d'en-tête/d'implémentation, puis # inclure le fichier d'implémentation à la fin de l'en-tête.

La fonctionnalité "exportation" de C++ peut fournir ou non une autre solution de contournement. La fonctionnalité est mal supportée et mal définie; Bien qu'il devrait en principe permettre une sorte de compilation séparée des modèles, il n'élimine pas nécessairement la demande que le compilateur soit capable de voir l'ensemble du corps du modèle.

5

En combien de fichiers? Si vous souhaitez simplement séparer les définitions de classe de l'implémentation, essayez this article dans les faqs C++. C'est à peu près la seule façon dont je sais que cela fonctionne pour le moment, mais certains IDE (Eclipse CDT par exemple) ne lieront pas correctement cette méthode et vous pourriez avoir beaucoup d'erreurs. Cependant, écrire vos propres fichiers makefiles ou utiliser Visual C++ cela a toujours fonctionné pour moi :-)

+0

+1 pour le lien vers le lien article –

+2

l'article est pas à jour! – iamantony

3

Lorsque/si votre compilateur prend en charge C++ 0x, le mot-clé extern peut être utilisé pour séparer les déclarations de modèle des définitions. Pour une brève explication, voir here. En outre, la section 6.3, «Le modèle de séparation», de Modèles C++: Le Guide complet de David Vandevoorde et Nicolai M. Josuttis décrit d'autres options.

alt text http://ak.buy.com/db_assets/prod_images/235/31025235.jpg

Questions connexes