Bonjour,
Je n’arrive pas à trouver de réponse assez simple aux questions que je me pose sur extern template, donc je vais les poser ici.
1ère question :
Soit le code suivant :
Ainsi que :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 template<typename T> class A { class Impl; std::unique_ptr<Impl> m; // ... }; //...
Avec bien évidemment, dans b.cpp le template class A<B> qui va bien.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 class B { // ... } extern template class A<B>;
Maintenant, A et B sont dans une bibliothèque partagée, utilisée par un programme P.
Supposons que je rajoute une méthode à A, à la fin pour ne pas changer l’ordre des méthodes, méthode appelée par du code de ma lib. Ai-je la garantie que je ne casse pas la compatibilité binaire, comme c’est le cas pour des classes non-template ? Et donc, que je peux mettre à jour ma lib sans toucher à P ?
2ème question:
- toujours dans le code précédent, y a-t-il un intérêt quelconque à déclarer std::unique_ptr<Impl> en tant qu’extern template pour éviter que le compilateur ne l’instancie dans une autre unité d’exécution ? (je pense que non puisqu’il ne connaît pas Impl, mais je me pose la question de comment il détermine dans ce cas sizeof(A) ).
Partager