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 :

Comment faire un template de template


Sujet :

Langage C++

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    303
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 303
    Par défaut Comment faire un template de template
    Bonjour,
    Je découvre les templates et j'ai un petit soucis avec une classe template.
    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
     
    template<typename T=double>
    class CRankEx
    {
    public:
    	CRankEx();
    	~CRankEx(){};
     
    protected:
    	typedef std::pair<_string, LPARAM> ItemPair;
    	typedef std::pair< template<T> ,ItemPair > MMapPair;
    	typedef std::multimap< template<T> , ItemPair> _mmap;
    	_mmap::const_iterator m_It;
    	_mmap m_mmap;
    .....
     
    };
    La declaration de la multimap ne passe pas !
    Pouvez-vous m'aider?
    Merci

  2. #2
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    typedef std::pair< T ,ItemPair > MMapPair;
    typedef std::multimap< T , ItemPair> _mmap;
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    303
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 303
    Par défaut
    Merci, mais hélas j'avais déjà essayé cette syntaxe sans succès.
    J'ai les erreurs suivantes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Warning	1	warning C4346: 'std::multimap<T,CRankEx<T>::ItemPair>::const_iterator' : dependent name is not a type	utilities.h	172	Phoenix
    Error	2	error C2146: syntax error : missing ';' before identifier 'm_It'	utilities.h	172	Phoenix
    Error	3	error C4430: missing type specifier - int assumed. Note: C++ does not support default-int	utilities.h	172	Phoenix
    la ligne 172 étant:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    	_mmap::const_iterator m_It;

  4. #4
    Membre chevronné

    Inscrit en
    Août 2007
    Messages
    300
    Détails du profil
    Informations forums :
    Inscription : Août 2007
    Messages : 300
    Par défaut
    typename _mmap::const_iterator m_It;

  5. #5
    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
    Pour le pourquoi du typename, cf ici:
    http://cpp.developpez.com/faq/cpp/in...LATES_typename
    "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)

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    303
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 303
    Par défaut
    Super merci une vrai mine d'or.
    mais... je rame encore. J'essaye de passer du code VS2008 vers gcc et cela accroche au niveau d'une fonction template.
    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
     
    class Bidon 
    {
    ....
    	template<typename T>
    	bool GetIDstrAs(UINT index, T &val)
    	{
    		if (index>1) 
    		{
    			ASSERT (0);
    			return false;
    		}
    		bool bRet = false;
    		index?bRet=from_string(_string(GetIDstr2()),val):bRet=from_string(_string(GetIDstr()),val);
    		return bRet;
    	};
    ....
    }
    avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    // Convert a string to a specified type
    template<typename T>
    bool from_string( _string & Str, T & Value )
    {
        // Build an input string with given string
    #ifdef UNICODE
    	std::wistringstream iss( Str );
    #else
    	std::istringstream iss( Str );
    #endif
    	// Try to make conversion 
    	return (( iss >> Value ) != 0);
    }
    j'obtiens une erreur du type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Multiple markers at this line
    	- no matching function for call to 'from_string(std::basic_string<char, 
    	 std::char_traits<char>, std::allocator<char> >, double&)'
    	- no matching function for call to 'from_string(std::basic_string<char, 
    	 std::char_traits<char>, std::allocator<char> >, int&)'
    je dois certainement utiliser typename devant la fonction from_string mais je ne trouve pas la syntaxe correcte
    Pouvez-vous m'aider?
    Merci

  7. #7
    Membre éclairé
    Avatar de gb_68
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2006
    Messages
    232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 232
    Par défaut
    Bonjour, dans
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    index?bRet=from_string(_string(GetIDstr2()),val):bRet=from_string(_string(GetIDstr()),val);
    tu construis des objets temporaires de type _string. Ces objets ne peuvent pas être passés par référence "simple" (sinon ils pourraient être modifiés, mais étant temporaires, ils seront irrécupérables par la suite - à la sortie de la fonction - ce qui aurait peu de sens). Le compilateur cherche donc une fonction ayant dans sa signature un passage par valeur
    from_string(std::basic_string<char, std::char_traits<char>, std::allocator<char> >, double&)
    Mais comme ta fonction ne modifie pas la chaine de caractère tu peux la passer en référence constante, et les objets temporaires seront acceptés
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bool from_string( const _string & Str, T & Value )

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    303
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 303
    Par défaut

    Super Merci

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

Discussions similaires

  1. [Joomla!] [Joomla 3.x] Comment faire pour rendre un template Right-To-Left par défaut?
    Par crazy_inf dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 29/11/2014, 21h13
  2. Comment faire ma propre classe/template vecteur
    Par touftouf57 dans le forum Visual C++
    Réponses: 2
    Dernier message: 11/11/2010, 12h43
  3. Réponses: 5
    Dernier message: 31/10/2008, 12h24
  4. Une boucle en template, comment faire?
    Par iflypunk dans le forum Général Python
    Réponses: 7
    Dernier message: 24/01/2008, 18h28
  5. [debutant]Comment faire un espace entre 2 apply-templates?
    Par Jayceblaster dans le forum XML/XSL et SOAP
    Réponses: 3
    Dernier message: 25/04/2006, 19h47

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