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

C++ Discussion :

erreur enum CRTP


Sujet :

C++

  1. #1
    Débutant
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 688
    Points : 176
    Points
    176
    Par défaut erreur enum CRTP
    Salut,

    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
     
     
    	template<class T>
    	struct broker
    	{
    		typedef T typeBroker;
    		static std::vector<std::string> extractListBroker(const std::string& broker)
    		{
    			std::vector<std::string> vec;
     
    			if(broker.empty())			
    			{
    				for(int i=0;i<typeBroker::nbBroker;++i)
    					vec.push_back( typeBroker::listBroker[i] );			
    			}			
    			else
    			{
    				typedef boost::tokenizer<boost::char_separator<char> > my_tok;
     
    				boost::char_separator<char> sep( ";" );
     
    				my_tok tok( broker, sep );
     
    				for ( my_tok::const_iterator i = tok.begin(); i != tok.end(); ++i )  
    					vec.push_back( *i ); 
    			} 
    			return vec;
    		}
     
    		std::string brokerToStr(typename typeBroker::BROKER i)
    		{
    			return typeBroker::listBroker[i];			
    		}
    	};
     
     
    	/* les point d'accés distants sur lesquels on peut traiter (ex: dbln et byln sont traitable sur bridge1) */
    	struct brokerDisTradable  : broker<brokerDisTradable>{
    		std::vector<std::string> listBroker;
    		brokerDisTradable()
    		{
    			listBroker.push_back("BRIDGE1" );
    			listBroker.push_back("BRIDGELONDON" );
    			listBroker.push_back("RECY" );
    			listBroker.push_back("CURRENEX" );
    		}
    		static const int nbBroker = 2;
    		enum BROKER  { BRIDGE1, BRIDGELONDON, RECY, CURRENEX };
    	};
    errro : error C2039: 'BROKER' : is not a member of broker_def::brokerDisTradable'

    une idée ?

    merci!

  2. #2
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    typename
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  3. #3
    Membre confirmé
    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 : 40
    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
    Points : 546
    Points
    546
    Par défaut
    Bonjour,
    Citation Envoyé par Goten Voir le message
    typename
    non il y est .

    Par contre, il me semble que faire cela n'est tout bonnement pas possible. Pour être définie, la classe brokerDisTradable a besoin que sa classe de base soit complètement définie avant elle. broker<brokerDisTradable> est donc générée avant brokerDisTradable, qui à ce moment la n'est pas entièrement définie (et ne contient pas encore BROKER).
    De plus on aboutirait à des cas insolubles
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    template<typename T>
    struct base
    {
        typedef typename T::type type;
    };
     
    struct TClass
    {
        typedef base<TClass>::type type;
    };
    Cela ne pose pas de problème dans les corps des fonctions (qui seront examinés après coup - ce qui permet le CRTP), mais pour leurs signatures si.

    Une solution serait de découper la classe
    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
    struct DisTradableList
    {
        std::vector<std::string> listBroker;
        DisTradableList()
        {
            listBroker.push_back("BRIDGE1" );
            listBroker.push_back("BRIDGELONDON" );
            listBroker.push_back("RECY" );
            listBroker.push_back("CURRENEX" );
        }
        static const int nbBroker = 2;
        enum BROKER  { BRIDGE1, BRIDGELONDON, RECY, CURRENEX };
    };
     
    struct brokerDisTradable : broker<DisTradableList>
    {};
    edit : je crois que ce point de la norme l'explique
    Citation Envoyé par norme
    14.6.2 Dependent names
    1 Inside a template, some constructs have semantics which may differ from one instantiation to another. Such a
    construct depends on the template parameters. In particular, types and expressions may depend on the type
    and/or value of template parameters (as determined by the template arguments) and this determines the
    context for name lookup for certain names.
    [...]
    Such names are unbound and are looked up at the point of
    the template instantiation
    (14.6.4.1) in both the context of the template definition and the context of the
    point of instantiation.

Discussions similaires

  1. erreur:class,interface,or enum expected
    Par siham-gh dans le forum Débuter avec Java
    Réponses: 4
    Dernier message: 25/12/2009, 19h41
  2. [enum] erreur s
    Par m4dm4x dans le forum Débuter avec Java
    Réponses: 1
    Dernier message: 09/11/2008, 00h09
  3. Des erreurs dans la déclaration d'une enum
    Par moooona dans le forum Langage
    Réponses: 4
    Dernier message: 28/05/2008, 04h33
  4. [MySQL] erreur à l'insert d'une entrée avec un champ ENUM
    Par mounia.n dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 27/05/2008, 16h44
  5. erreur sur enum à la creation de la table
    Par mnem0 dans le forum Requêtes
    Réponses: 4
    Dernier message: 08/12/2006, 01h23

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