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++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre r�gulier
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    9
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 9
    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 Expert
    Avatar de m�phistopheles
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    1 551
    D�tails du profil
    Informations personnelles :
    �ge : 38
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 1 551
    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

  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 : 33
    Localisation : Suisse

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

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    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
    Membre r�gulier
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    9
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 9
    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
    Membre r�gulier
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    9
    D�tails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2005
    Messages : 9
    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