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 :

Erreur de template


Sujet :

Langage C++

  1. #1
    Membre habitué
    Inscrit en
    Octobre 2004
    Messages
    616
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 616
    Points : 164
    Points
    164
    Par défaut Erreur de template
    Bonjour ... passons les avardage inutile, voici les morceau de code incriminé :

    dans le cRessourcesManager.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    		  template < class T > T * get( const std::string & Id ) const
    		  {
    			  std::map<std::string, cItem *>::iterator it;
    			  if ( Items.find(Id) == Items.end() )
    			  {
    				  std::cout << " Erreur ( classe cRessourcesManager ) " << std::endl ; 
    			  }
    			  else
    			  {
    				  return  (T *) * it;
    			  }
    voici l'apelle qui ne passe pas : ( dans une autre classe)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     cFont * temp = cRessourcesManager::GetInstance().get<cFont>("Ma Police") ;
    erreur:
    error C2440: 'type cast' : cannot convert from 'std::allocator<_Ty>::value_type' to 'cFont *'
    with
    [
    _Ty=std::pair<const std::string,cItem *>
    ]
    Merci d'avance

  2. #2
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Les itérateurs de map sont des paires <clé, valeur>, pour renvoyer la valeur il faut donc renvoyer It->second.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    return static_cast<T*>(It->second);

  3. #3
    Membre habitué
    Inscrit en
    Octobre 2004
    Messages
    616
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 616
    Points : 164
    Points
    164
    Par défaut
    merci, j'avais pensé que intuitivement cette syntaxe me renverrai la 2nd element et non la clé associé ^^ autant pour moi !

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    >	msvcp71.dll!std::basic_string<char,std::char_traits<char>,std::allocator<char> >::assign(const char * _Ptr=0x00000006)  Line 622 + 0x18	C++
    J'ai une erreur a l'execution ( le programme plante )
    Ci-dessus l'erreur en mode debug .

    Je cherche juste a affficher des variables menbres de mon objet crée précédement

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	 cFont * temp = cRessourcesManager::GetInstance().get<cFont>("Ma police") ;
    	 int i = temp->nbre ;
    Ceci passe bien , mais dés que je tente un

    std::cout << i ;

    Ca plante et génére l'erreur montré en début de post .

    edit: un
    temp->nbre = 10 ; me fait planter de même

    EDIT2 :
    oula ca a l'air tordu O_o
    si je rajoute un

    std::cout << "DONE" ;

    juste avant le return .... ( de la fonction get ) j'ai un plantage a l'execution ...

  4. #4
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Dans ta fonction tu déclares un itérateur it sans lui donner de valeur puis tu le renvoies direct.
    Ton objet renvoyé sera donc très certainement invalide, ce qui explique tes plantages. It devrait contenir le résultat de Items.find(Id) plutôt que rien du tout.

  5. #5
    Membre habitué
    Inscrit en
    Octobre 2004
    Messages
    616
    Détails du profil
    Informations forums :
    Inscription : Octobre 2004
    Messages : 616
    Points : 164
    Points
    164
    Par défaut
    Mais ou ais-je la tête ..??? .. C'est le genre d'erreur TRES mais alors TRES bête lol ... je déclare mon itérateur et je ne l'utilise pas ^^

    je vais tenter de corriger ca de suite
    merci

    edit: pb corrigé ... j'ai mis un peu de temps car j'avais oublier que j'avais mis la fonction en const ... mais voila tout va bien, encore merci lou² )

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

Discussions similaires

  1. [templates][debutant]erreur "shadows template param"
    Par Gotmere dans le forum Langage
    Réponses: 3
    Dernier message: 12/12/2007, 23h30
  2. [OpenTBS] Erreur système template
    Par snyfir dans le forum Bibliothèques et frameworks
    Réponses: 4
    Dernier message: 27/06/2007, 10h02
  3. [Joomla!] erreur du template joomla 1.5
    Par phpieur dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 12
    Dernier message: 24/02/2007, 11h15
  4. Erreur Gcc, template et iterator
    Par aidos dans le forum Langage
    Réponses: 7
    Dernier message: 14/03/2006, 09h04

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