extern template et compatibilité binaire
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:
1 2 3 4 5 6 7 8 9
|
template<typename T>
class A
{
class Impl;
std::unique_ptr<Impl> m;
// ...
};
//... |
Ainsi que :
Code:
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) ).