Afficher : Delphi C++
Préférences d'affichage

Commutateurs du compilateur relatifs aux templates

De RAD Studio XE2

Remonter à Spécificités du C++

La famille -Jg des commutateurs de compilation contrôle la façon dont les instances de templates sont générées par le compilateur. Chaque instance de template que le compilateur rencontre sera affectée par la valeur du commutateur à l'endroit où la première occurrence de cette instance particulière est vue par le compilateur.

Pour les fonctions template, le commutateur s'applique à toutes les instances de fonctions. Pour les classes template, il s'applique à toutes les fonctions membre et à tous les membres de données statiques de la classe template. Dans tous les cas, ce commutateur s'applique seulement aux instances de templates générées par le compilateur et jamais aux instances définies par l'utilisateur. Cependant, vous pouvez utiliser ce commutateur pour indiquer au compilateur les instances qui seront définies par l'utilisateur de manière à ce qu'elles ne soient pas générées à partir du template.

Sémantique de génération des templates

Le compilateur C++ génère les méthodes suivantes pour les instances de templates :

  • Les méthodes effectivement utilisées
  • Les méthodes virtuelles d'une instance
  • Toutes les méthodes de classes explicitement instanciées

L'avantage de ce comportement aboutit à des fichiers objet, bibliothèque et exécutable sensiblement moins volumineux, suivant l'intensité de l'utilisation des templates.

Facultativement, vous pouvez utiliser le commutateur -Ja pour générer toutes les méthodes.

Vous pouvez aussi imposer la génération de toutes les méthodes hors ligne d'une instance de template à l'aide de la syntaxe d'instanciation de template explicite définie par la norme ISO/ANSI C++ Standard. La syntaxe est :

template class nomclasse<paramètre de template>;

L'exemple STL suivant amène le compilateur à générer toutes les méthodes hors ligne pour la classe list<char>, qu'elles soient ou non référencées par le code de l'utilisateur :

template class list<char>

Vous pouvez aussi instancier explicitement une méthode unique ou un membre de données statique unique d'une classe template, auquel cas la méthode est générée par le fichier .OBJ, même si elle n'est pas utilisée :

template void classname <template parameter>:: methodname ();
Versions précédentes
Autres langues