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 :
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;
 // ...
};
//...
Ainsi que :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
class B
{
 // ...
}
extern template class A<B>;
Avec bien évidemment, dans b.cpp le template class A<B> qui va bien.

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) ).