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

Langage C++ Discussion :

[template]Résolution implicite d'un type template


Sujet :

Langage C++

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 9
    Points : 6
    Points
    6
    Par défaut [template]Résolution implicite d'un type template
    Bonjour

    Dans le logiciel que je développe, j'utilise des std::map<KeyType, ValueType> avec des ValueType différents pour le même KeyType.
    Je souhaiterais écrire une fonction template capable de me chercher un itérateur pour une clef donnée quel que soit ValueType.

    Déclaration:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    template<class T>
    typename std::map<KeyType, T>::const_iterator
    findMatch(std::map<KeyType, T>, KeyType);
    Implémentation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    template<class T>
    typename std::map<KeyType, T>::const_iterator
    findMatch(std::map<KeyType, T> i_map, KeyType i_key)
    {
       return i_map.find(i_key);
    }
    Appel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    std::map<KeyType, Truc*> map;
    KeyType key;
    /*...*/
    std::map<KeyType, Truc*>::const_iterator it = findMatchStrict(map, key);
    Le compilateur est d'accord, mais le linker me jette :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    error LNK2019: symbole externe non résolu [...]
    Si je garde la déclaration telle quel et que j'implémente en spécialisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    std::map<KeyType, Truc*>::const_iterator
    findMatch(std::map<KeyType, Truc*> i_map, KeyType i_key)
    {
       return i_map.find(i_key);
    }
    Ca compile et ça link, mais c'est pas ce que je veux...

  2. #2
    Membre éprouvé
    Avatar de méphistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    Points : 1 220
    Points
    1 220
    Par défaut
    Bonjour.

    Pourrais-tu donner plus de détails sur truc et keyType car chez moi, le code suivant compile :

    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
    #include<map>
    #include<string>
    typedef int KeyType;
     
     
    template<class T>
    typename std::map<KeyType, T>::const_iterator
    findMatch(std::map<KeyType, T> i_map, KeyType i_key)
    {
       return i_map.find(i_key);
    }
     
    int main()
    {
    	std::map<KeyType, std::string*> map;
    	KeyType key;
    	/*...*/
    	std::map<KeyType, std::string*>::const_iterator it = findMatch(map, key);
    	return 0;
    }
    Bonne chance
    Méphistophélès
    Si la solution ne résout pas votre problème, changez le problème...
    Cours et tutoriels C++ - FAQ C++ - Forum C++.

  3. #3
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Points : 4 732
    Points
    4 732
    Par défaut
    Pas de fonction template dans un fichier .cpp car le compilo a besoin du code quand il instancie la fonction.

    Solution => Ne separe pas declaration et definition, met tout d'un seul trait dans un fichier .h
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    Argh l'erreur de débutant !
    Je définissait mes méthodes template dans le .cpp

    Les méthodes template doivent être définie complètement dans le .h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class MaClasse
    {
    public:
       template<...> void maMethodeTemplate()
       {
          /* ICI ET PAS DANS LE .CPP ! */
       }
    };
    Merci

    [Edit] Grillé, j'avais pas vu ton dernier message...

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    Juste une remarque pour finir, au cas où quelqu'un voulait utiliser ce code :
    il faut passer la map par référence à la fonction, sinon ça ne marchera pas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    findMatch(std::map<KeyType, T>&  i_map, KeyType i_key)
    Désolé pour la boulette...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 29/07/2012, 20h30
  2. Réponses: 13
    Dernier message: 25/10/2006, 16h17
  3. [XPath] Apply-templates sur des balises de type pwet:test
    Par BiM dans le forum XSL/XSLT/XPATH
    Réponses: 4
    Dernier message: 02/09/2006, 15h17
  4. Fonction template recursive, avec imbrication de types
    Par YéTeeh dans le forum Langage
    Réponses: 5
    Dernier message: 28/04/2006, 17h02
  5. Réponses: 10
    Dernier message: 27/04/2005, 11h26

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