• [^] # Re: erratum

    Posté par . En réponse au message templates et héritage.. Évalué à 1.

    Ben si, ça pose problème : même si deux types T1 et T2 sont reliés par héritage, top<T1> et top<T2> sont deux types bien différents.

    En fait, après avoir pris connaissance de l'article de la FAQ Lite, T1 et T2 ne sont pas du même type au sens "C" du terme (en gros il ne font pas la même taille).
    Mais d'un point de vue objet, si T2 hérite de T1, un truc du type top<T1> peut référencer top<T2> , puisque, apriori, tous les comportements de T2 sont compatible avec T1.


    Dans ce cas, l'important n'est pas les comportments de T1 et de T2, mais ceux des templates associés top<T1> et top<T2>. On pourrait a priori penser que si T1 et T2 ont le même comportement, les templates auront fatalement le même. Ca marcherait bien si le C++ ne comportait pas de spécialisation des templates, qui te permet d'avoir des comportements différents, et donc des définitions différentes, pour certains paramètres du template. L'exemple classique est std::vector<bool> qui dans certaines implémentations de la SL n'est pas implémenté de la même façon que ses petits camarades std::vector<int> ou std::vector<char>.

    L'exemple de code que tu donnes marche si la fonction fonc ne prend qu'un T est pas de vecteur de T. C'est le vecteur qui pose problème : un conteneur de T2* n'est pas un conteneur de T1*, et virer les pointeurs ne change pas le problème.

    La solution qui me parait la plus simple est de ne pas construire des vecteurs de T2*, mais des vecteurs de T1*, et de vérifier dans topSpe::fonc que les T1* du vecteur pointent bien sur des vrais T2* (dynamic_cast est ton ami).