instanciation de modèle de classe

Je viens de lire l’article du wiki sur CRTP , et je suis un peu confus quant à l’instanciation de modèles.

Selon le wiki,

Les corps des fonctions membres (définitions) ne sont instanciés que longtemps après leurs déclarations.

Je ne comprends pas bien ce que cela signifie.

Supposons que j’ai un modèle de classe:

template  class A { public: void foo(T t) { //... }; }; 

Lorsque j’instancie le modèle de classe A, instancie-t-il la fonction membre foo ()?

Par exemple:

 //in .cpp file int main() { A a; //question 1 //class template is instantiated here, isn't it? //What about foo(), is it instantiated too? a.foo(10); //question 2 //according to the quotation, foo() will not be instantiated until it is used. //if so, foo() is instantiated right here, not in question 1, right? } 

Vous semblez confondre une chose:

L’instanciation se produit pendant la compilation , pas pendant l’exécution. Par conséquent, vous ne pouvez pas dire “sur quelle ligne” un modèle de classe ou un modèle de fonction a été instancié.

Cela dit, vous avez raison sur le fait que les modèles de fonction de membre ne sont pas instanciés avec les modèles de classe.

Vous pourriez l’observer dans un tel cas: Vous avez les fichiers suivants

  • template.h (définit la classe A et la fonction A :: toto)
  • a.cpp (utilise A)
  • b.cpp (utilise A et A :: foo)

Ensuite, lors de la compilation de a.cpp, seul A serait instancié. Cependant, lors de la compilation de b.cpp, les deux seraient instanciés.

De ce fait, dans le cas où A :: foo contiendrait du code sémantiquement invalide pour un ensemble donné de parameters de modèle, vous obtiendriez des erreurs de compilation dans b.cpp, mais pas a.cpp.

J’espère que ça clarifie les choses!

Avec les modèles de classe, la règle de base est que seuls sont instanciés les membres réellement utilisés.

Si vous voulez une instanciation complète, le C ++ offre une instanciation explicite (mais ce n’est généralement pas le cas; le fait que tous les bits ne soient pas totalement instanciés signifie que votre classe de modèle est encore plus générique, car elle réduit les exigences sur T la recherche de types non dépendants (des choses qui ne dépendent pas de T ) se produit toujours).

Vous trouverez une réponse plus complète ici: Détails sur l’instanciation de modèle des compilateurs GCC et MS