• [^] # Re: Templates et C++03

    Posté par . En réponse au message Problème de templates: undefined reference. Évalué à 1.

    Effectivement, en mettant tout le code dans le header, ça marche… mais ce n'est pas très propre…

    J'ai du mal à voir en quoi mettre des macro dans les headers est "propre" alors que mettre un métaprogramme template dans les headers n'est "pas très propre". Les deux sont de la métaprogrammation. Ce n'est pas parce que l'un ressemble à une implémentation que ça en est une.

    Sinon, std::string n'hérite pas de std::basic_string. std::string est exactement std::basic_string<char>. Il n'y a pas de lien d'héritage entre un patron et son instanciation. En fait, il n'y a pas de lien du tout. On peut très bien avoir un patron:

    template <typename A>
    class B {
     void coucou();
    };
    
    

    et décider que B<int> est totalement différent…

    template <>
    class B<int> : std::runtime_error {
    private:
     void cocu();
    public:
     B(float i);
     const char* what() const; // noexcept en C++11
    protected:
     double quarante_deux;
    };
    
    

    (ce n'est pas le cas de std::basic_string<char>sur les bonnes implémentations, mais ça pourrai).

    Pour cette raison, si tu veut à la fois supporter les std::string et std::u32string, tu n'a pas vraiment le choix que d'utiliser un template. (bon, ok, tu peux utiliser boost::variant ou boost::any, mais c'est franchement se tirer une balle dans le pied).