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.