Programmation C-C++/Les templates/Fonctions exportées
Comme on l'a vu, les fonctions et classes template sont toutes instanciées lorsqu'elles sont rencontrées pour la première fois par le compilateur ou lorsque la liste de leurs paramètres est fournie explicitement.
Cette règle a une conséquence majeure : la définition complète des fonctions et des classes template doit être incluse dans chacun des fichiers dans lequel elles sont utilisées. En général, les déclarations et les définitions des fonctions et des classes template sont donc regroupées ensemble dans les fichiers d'en-tête (et le code ne se trouve pas dans un fichier C++). Cela est à la fois très lent (la définition doit être relue par le compilateur à chaque fois qu'un template est utilisé) et ne permet pas de protéger le savoir faire des entreprises qui éditent des bibliothèques template, puisque leur code est accessible à tout le monde.
Afin de résoudre ces problèmes, le C++ permet de « compiler » les fonctions et les classes template, et ainsi d'éviter l'inclusion systématique de leur définition dans les fichiers sources. Cette « compilation » se fait à l'aide du mot-clé export.
Pour parvenir à ce résultat, vous devez déclarer « export » les fonctions et les classes template concernées. La déclaration d'une classe template export revient à déclarer export toutes ses fonctions membres non inline, toutes ses données statiques, toutes ses classes membres et toutes ses fonctions membres template non statiques. Si une fonction template est déclarée comme étant inline, elle ne peut pas être de type export.
Les fonctions et les classes template qui sont définies dans un espace de nommage anonyme ne peuvent pas être déclarées export. Voir le Chapitre 11 plus de détails sur les espaces de nommage.
Exemple 12-16. Mot-clé export
[modifier | modifier le wikicode]export template <class T>
void f(T); // Fonction dont le code n'est pas fourni
// dans les fichiers qui l'utilisent.
Dans cet exemple, la fonction f est déclarée export. Sa définition est fournie dans un autre fichier, et n'a pas besoin d'être fournie pour que f soit utilisable.
Les définitions des fonctions et des classes déclarées export doivent elles aussi utiliser le mot clé export. Ainsi, la définition de f pourra ressembler aux lignes suivantes :
export template <class T>
void f(T p)
{
// Corps de la fonction.
return ;
}