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

SL & STL C++ Discussion :

Probleme compilation map.find


Sujet :

SL & STL C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 103
    Par défaut Probleme compilation map.find
    Bonjour,

    J'ai un probleme de compilation sous VC.
    Voici le code :

    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
    // geometric_shape_factory.hpp
     
    #ifndef __GEOMETRIC_SHAPE_FACTORY_HPP__
    #define __GEOMETRIC_SHAPE_FACTORY_HPP__
     
    #include <map>
    #include <string>
     
    #include "geometric_shape.hpp"
     
    template <typename KEY , class OBJECT> class GeometricShapeFactory
    {
    public:
    	// un pointeur de fonction qui retourne un Object*
    	typedef OBJECT *(*Creator)(void);
    	// Le map qui stocke les associations entre la cle et le pointeur de fonction
    	std::map<KEY, Creator> _registeredCreator;
     
    	static bool Register(KEY key, Creator creator)
    	{
    		if( _registeredCreator.find(key) != _registeredCreator.end() )
    			return false; // la clef est deja utilisé
    		_registeredCreator.insert(std::pair<KEY, Creator>(key, creator) );
    			return true;
    	}
     
    	OBJECT * Create(KEY key)
    	{
    		OBJECT *object;
    		Creator creator;
    		std::map<KEY, Creator>::iterator it;
    		// On cherche le pointeur de fonction associé a la clef
    		it = _registeredCreator.find(key);
    		if( it == _registeredCreator.end() )
    			return NULL; // on ne l'a pas trouvé
    		// On récupère le pointeur de fonction
    		creator = (*it).second;
    		// On appelle la fonction pour créer un nouvel objet
    		object = (*creator)();
    		// On retourne l'objet
    		return object;
    	}
    };
     
    #endif
    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
    // square_shape.hpp
     
    #ifndef __SQUARE_SHAPE_HPP__
    #define __SQUARE_SHAPE_HPP__
     
    #include "geometric_shape.hpp"
    #include <vector>
    #include <iostream>
     
    /**
    @brief
    @author OTO
    @date
    **/
     
    class SquareShape : public GeometricShape
    {
    public:
    	/// \brief Création d'un objet SquareShape
    	static GeometricShape* create( void );
    	/// Set / Modification des paramètres d'un objet SquareShape
    	/// @param param Le vecteur contenant les paramètres de l'objet SquareShape
    	void SetParameters( const std::vector<double> & param );
    	/// Permet de connaître l'état du flag _is_registered
    	bool IsRegistered() {std::cout << "registered = " << _is_registered;return _is_registered;};
     
    private:
     
    	/// Flag indiquant si l'objet SquareShape est enregistré dans la <i>Factory</i> GeometricShapeFactory
    	static bool _is_registered;
    	double _size;
    };
     
    /**
    * @todo Finir l'implémentation de la classe ...
    **/
     
    #endif
    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
    // square_shape.cpp
     
    #include "../include/square_shape.hpp"
    #include "../include/geometric_shape_factory.hpp"
     
    #include <iostream>
    #include <string>
    #include <algorithm>
     
    GeometricShape * SquareShape::create(void)
    {
    	return new SquareShape();
    }
     
    void SquareShape::SetParameters( const std::vector<double> & param )
    {
    	;
    }
     
    bool SquareShape::_is_registered = GeometricShapeFactory<std::string,GeometricShape>::Register("SquareShape", SquareShape::create);
    Et j'ai les erreurs suivantes a la compilation (j'ai volontairement omis de mettre le code de la classe rectangle_shape qui est similaire a celui de la classe square_shape ...) :

    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
    Compilation...
    square_shape.cpp
    e:\Developpement\pimplib\pimplib_geometric_objects\src\../include\geometric_shape_factory.hpp(19) : error C2228: la partie gauche de '.find' doit avoir un type class/struct/union
            le type est ''
            e:\Developpement\pimplib\pimplib_geometric_objects\src\../include\geometric_shape_factory.hpp(18) : lors de la compilation de la fonction membre du modèle de classe 'bool GeometricShapeFactory<KEY,OBJECT>::Register(KEY,GeometricShapeFactory<KEY,OBJECT>::Creator)'
            with
            [
                KEY=std::string,
                OBJECT=GeometricShape
            ]
            src\square_shape.cpp(18) : voir la référence à l'instanciation du modèle de classe 'GeometricShapeFactory<KEY,OBJECT>' en cours de compilation
            with
            [
                KEY=std::string,
                OBJECT=GeometricShape
            ]
    e:\Developpement\pimplib\pimplib_geometric_objects\src\../include\geometric_shape_factory.hpp(19) : error C2228: la partie gauche de '.end' doit avoir un type class/struct/union
            le type est ''
    e:\Developpement\pimplib\pimplib_geometric_objects\src\../include\geometric_shape_factory.hpp(21) : error C2228: la partie gauche de '.insert' doit avoir un type class/struct/union
            le type est ''
    rectangle_shape.cpp
    e:\Developpement\pimplib\pimplib_geometric_objects\src\../include\geometric_shape_factory.hpp(19) : error C2228: la partie gauche de '.find' doit avoir un type class/struct/union
            le type est ''
            e:\Developpement\pimplib\pimplib_geometric_objects\src\../include\geometric_shape_factory.hpp(18) : lors de la compilation de la fonction membre du modèle de classe 'bool GeometricShapeFactory<KEY,OBJECT>::Register(KEY,GeometricShapeFactory<KEY,OBJECT>::Creator)'
            with
            [
                KEY=std::string,
                OBJECT=GeometricShape
            ]
            src\rectangle_shape.cpp(14) : voir la référence à l'instanciation du modèle de classe 'GeometricShapeFactory<KEY,OBJECT>' en cours de compilation
            with
            [
                KEY=std::string,
                OBJECT=GeometricShape
            ]
    e:\Developpement\pimplib\pimplib_geometric_objects\src\../include\geometric_shape_factory.hpp(19) : error C2228: la partie gauche de '.end' doit avoir un type class/struct/union
            le type est ''
    e:\Developpement\pimplib\pimplib_geometric_objects\src\../include\geometric_shape_factory.hpp(21) : error C2228: la partie gauche de '.insert' doit avoir un type class/struct/union
            le type est ''
    geometric_shape_factory.cpp
    Génération de code en cours...
     
    Temps de génération 0:01
    Le journal de génération a été enregistré à l'emplacement "file://e:\Developpement\pimplib\pimplib_geometric_objects\Release\BuildLog.htm"
    pimplib_geometric_objects - 6 erreur(s), 0 avertissement(s)
    Je ne comprends absolument pas pourquoi ... Une idee ?

    D'avance merci.

  2. #2
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    // un pointeur de fonction qui retourne un Object*
    	typedef OBJECT *(*Creator)(void);
    Ici Creator est un pointeur de fonction simple.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    GeometricShape * SquareShape::create(void)
    {
    	return new SquareShape();
    }
    //...
    bool SquareShape::_is_registered = GeometricShapeFactory<std::string,GeometricShape>::Register("SquareShape", SquareShape::create);
    Ici tu passes à ta fonction Register un pointeur sur fonction membre (la syntaxe est fausse au passage, cela devrait être &SquareShape::create) au lieu d'un pointeur sur fonction, comme elle l'attend.

    Deux solutions : soit tu définis ta fonction create hors de ta classe SquareShape, soit tu change le type de Creator :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    typedef OBJECT* (GeometricShape::*Creator)();

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 103
    Par défaut
    Deux solutions : soit tu définis ta fonction create hors de ta classe SquareShape, soit tu change le type de Creator :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    typedef OBJECT* (GeometricShape::*Creator)();
    J'ai opte pour la seconde solution, en changeant le type de Creator comme tu me l'as indique. Une autre erreur maintenant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    square_shape.cpp
    \Developpement\pimplib\pimplib_geometric_objects\src\square_shape.cpp(18) : error C2664: 'GeometricShapeFactory<KEY,OBJECT>::Register' : impossible de convertir le paramètre 2 de 'GeometricShape *(__thiscall SquareShape::* )(void)' en 'GeometricShapeFactory<KEY,OBJECT>::Creator'
            with
            [
                KEY=std::string,
                OBJECT=GeometricShape
            ]
            and
            [
                KEY=std::string,
                OBJECT=GeometricShape
            ]
            Les types pointés n'ont aucun rapport entre eux ; conversion nécessitant reinterpret_cast, cast de style C ou cast de style fonction

  4. #4
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Par défaut
    Je me suis planté dans mon post d'avant, j'avais pas fait gaffe que ta fonction create était static (mes excuses ), donc ta syntaxe du typedef était correcte, il manque juste le & devant SquareShape::create :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    bool SquareShape::_is_registered = GeometricShapeFactory<std::string,GeometricShape>::Register("SquareShape", &SquareShape::create)

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2006
    Messages : 103
    Par défaut
    Citation Envoyé par bolhrak Voir le message
    Je me suis planté dans mon post d'avant, j'avais pas fait gaffe que ta fonction create était static (mes excuses ), donc ta syntaxe du typedef était correcte, il manque juste le & devant SquareShape::create :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    bool SquareShape::_is_registered = GeometricShapeFactory<std::string,GeometricShape>::Register("SquareShape", &SquareShape::create)
    Ouais, ben ca veut toujours pas. Meme erreur que la precedente ...

  6. #6
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Par défaut
    Ta fonction Register est static, elle essaye de modifier une variable de classe non statique (_registeredCreator).

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

Discussions similaires

  1. Probleme a la compilation "cannot find symbol"
    Par nacrooks dans le forum Général Java
    Réponses: 4
    Dernier message: 20/01/2010, 15h16
  2. [DEBUTANT] problem compilation eclipse
    Par roninou dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 14/01/2005, 15h59
  3. [JAR]Probleme compilation avec jdom
    Par ronaldgis dans le forum Eclipse Java
    Réponses: 4
    Dernier message: 04/08/2004, 11h31
  4. probleme compilation classe avec Borland c++ compiler 5.5
    Par softblue dans le forum Autres éditeurs
    Réponses: 2
    Dernier message: 17/06/2004, 15h16
  5. [Debian] problème compilation jbuilder 9...
    Par Ancien_Do.Urden dans le forum JBuilder
    Réponses: 5
    Dernier message: 20/03/2004, 15h02

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