• [^] # Re: erratum

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


    void test (top<topParam> &t) {
    cout << "test passé" << endl;
    }

    j'essaie de l'appeler avec un top ce qui ne devrait poser aucun problème puisque subTopParam hérite de topParam


    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. C'est donc normal que ça plante. C'est un peu dans le même genre que l'exemple garage de voitures/garage de véhicules de la FAQ lite (http://www.parashift.com/c++-faq-lite/proper-inheritance.html#faq-2(...) ).

    À mon avis, la solution la plus propre et la plus simple est de faire de test une fonction template :

    template<typename T>
    void test (top<T> & t) {
    cout << "test passé" << endl;
    }

    Et dans cette fonction de tester si le type T dérive bien de topParam. La bibliothèque boost fournit des classes de trait permettant de tester ce genre de choses (cf. boost::is_base_and_derived, http://www.boost.org/libs/type_traits/#relationships(...) ). Si tu ne veux/peux pas utiliser ce genre de choses, il faudra faire joujou avec static_cast, pour transformer un T* en topParam*, et voir si ça passe. Il te faudra ensuite gérer le cas où T ne dérive pas de topParam (lancer une exception, prévoir un comportement par défaut, ...).

    Le problème vient du fait que tu mélanges du polymorphisme statique (résolu à la compilation, les templates) et du polymorphisme dynamique (résolu à l'exécution, l'héritage). As-tu vraiment besoin de faire ce genre de choses ?

    Ce qu'on voit en général dans l'utilisation des templates (cf. la bibliothèque standard du C++, notamment les itérateurs et les algorithmes), c'est une doc genre "le paramètre Machin doit avoir telle propriété". Si l'utilisateur ne respecte pas les préconditions, tant pis, il n'avait qu'à lire la doc :-)