IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

Classe normale, méthode template, problème de compilation


Sujet :

C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Août 2002
    Messages
    225
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 225
    Points : 118
    Points
    118
    Par défaut Classe normale, méthode template, problème de compilation
    Bonjour tout le monde !

    Je suis en train d'essayer d'implémenter une classe non template ayant une méthode template et je rencontre un problème de compilation que je n'arrive pas à résoudre.

    Voici un exemple de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
     
    class Base
    {
    };
     
    template <typename T>
    class TBase : public Base
    {
    public:
        TBase(const T& data):_data(data) {}
        virtual void Print() const = 0;
     
    protected:
        T _data;
    };
     
    template <typename T>
    class ST : public TBase<T>
    {
    public:
        ST(const T& data):TBase<T>(data) {}
        virtual void Print() { cout << "data = " << this->_data << endl; }
    };
     
    class Factory
    {
    public:
        Factory()
        {
            _map["int"] = new ST<int>(4);
            _map["string"] = new ST<const char*>("Test");
        }
     
        template <typename T>
        TBase<T>* getTBase(const char* name)
        {
            return _map[name];
        }
     
    private:
        std::map< const char*, Base* > _map;
    };
     
    template <typename T>
    void DoPrint(TBase<T>* dummy)
    {
        dummy->Print();
    }
     
    int main()
    {
        Factory f;
        DoPrint( f.getTBase("int") );
        DoPrint( f.getTBase("string") );
     
        return 0;
    }
    Voila donc tout le code.

    Tout le code est dans un seul fichier (c'est juste un test pour valider le fonctionnement).

    Lorsque le main ne contient pas les appels aux méthodes DoPrint (et surtout aux méthodes getTBase), ça compile.

    Par contre, lorsque le code est complet comme ci dessus, problème, et j'ai les messages d'erreurs suivants (1 message d'erreur pour chaque appel) :
    Pas de fonction concordante pour l'appel à Factory::getTBase


    Je me dit que le compilateur n'arrive pas à résoudre l'ambiguité des types ... peut être que ça doit être ça mais je n'en suis pas sur. Si c'est ça, comment faire pour résoudre mon problème ? Est il possible de spécialiser la méthode template ? Si oui, comment ?

    Si je suis complètement à côté de la plaque, je dois aller dans quelle direction alors pour arriver à faire ce que je veux ?

    Je précise quelques dernières choses, je travaille sous Linux (compilateur GCC ... me souviens pas de la version par contre) et quelque part dans mon code, j'ai une méthode qui attends en paramètre une référence sur un TBase<T> ... d'où l'utilisation de la méthode DoPrint pour valider.

    Voila, j'espère que l'un ou l'une d'entre vous aura un élément de réponse à me donner pour me permettre d'avancer.

    D'avance merci.

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 069
    Points : 12 113
    Points
    12 113
    Par défaut
    C'est pas le bon forum, ici , c'est C++/CLI.

    Moi, je n’aurais même pas pensé qu'un compilateur accepte une méthode template dans une classe non template. Pour moi, c'est contradictoire.

    Pour moi, le typage fort est important et chaque classe devrait être responsable de sa Factory. A moins d'utiliser des conteneurs IoC mais c'est une autre histoire.

  3. #3
    En attente de confirmation mail

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Points : 3 311
    Points
    3 311
    Par défaut
    @bacelar: Je ne voit pas en quoi c'est contradictoire.

    Ta map contient des Base*, et tu voudrais les retourner par la fonction en voulant les faire passer pour des TBase<T>*, or TBase<T> n'est pas parente de Base, ce n'est déjà pas logique.

  4. #4
    Expert éminent sénior
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 069
    Points : 12 113
    Points
    12 113
    Par défaut
    @bacelar: Je ne voit pas en quoi c'est contradictoire.
    Bin, une classe instanciable dont on ne connait pas la signature d'une de ses méthodes, ça m'interpelle.

  5. #5
    En attente de confirmation mail

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Points : 3 311
    Points
    3 311
    Par défaut
    Un conteneur qui peut contenir n'importe quoi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    struct Base 
    { virtual ~Base() =0; };
     
    Base::~Base() {}
     
    template<class T>
    class Object : public Base
    {
    	T t;
     
    	public:
    		Object(T& tt) : Base(), t(tt) {}
    };
     
    class Container
    {
    	std::vector<std::shared_ptr<Base> > v;
     
    	public:
    		template<class T>
    		void push_back(T& t)
    		{ v.push_back(std::shared_ptr<Object<T> >(new Object<T>(t))); }
    };

  6. #6
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Citation Envoyé par bacelar Voir le message
    Bin, une classe instanciable dont on ne connait pas la signature d'une de ses méthodes, ça m'interpelle.
    Et comment tu coderais un opérateur d'affectation (&copy ctor) qui peut accepter des types convertible? (cf smart ptr etc)
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

Discussions similaires

  1. classe normale/méthodes statiques ou classe abstraite/méthodes normales
    Par Renaud MENGELLE dans le forum Architecture
    Réponses: 4
    Dernier message: 19/07/2012, 15h01
  2. Réponses: 10
    Dernier message: 08/06/2012, 09h22
  3. Réponses: 4
    Dernier message: 22/11/2010, 14h15
  4. [Template]Probléme de compilation
    Par chapeaul dans le forum Langage
    Réponses: 2
    Dernier message: 10/09/2010, 18h34
  5. Réponses: 1
    Dernier message: 30/08/2010, 13h11

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo