Partage
  • Partager sur Facebook
  • Partager sur Twitter

type/value mismatch at argument 2 in template....

expected a type got 'button'

Sujet résolu
    15 mai 2008 à 13:39:59

    Bonjour!

    Euh j'ai un léger problème auquel je ne comprends strictement rien.

    Voici mon code

    GUIManager.hpp

    /*****************************************//**
    GUI manager : Utilitaire chargeant les graphismes tels que les boutons
    Pointeurs contenus:
    	Button:
    		sf::Image *GUIschedule		(NonDynamique)
    	Manager:
    		sf::RenderWindow *myApp		(NonDynamique)
    
    **//*****************************************/
    #ifndef HPP_INCLUDE_GUIMANAGER_0
    #define HPP_INCLUDE_GUIMANAGER_0
    
    
    
    namespace Gui{
    
    	//Objets pouvant être chargé par la GUI
    	enum {Button, Count};
    
    	//Paramètres spécifiques au Objets
    	//Button begin
    	namespace ButtonSize{
    		enum {Width = 25,Height = 50};
    	}
    	namespace ButtonMode{
    		enum {Hide,Active,Disabled,Count};
    	} //ButtonMode
    
    	namespace ButtonState{
    		enum {Standard,Moved,Pushed,Count};
    	} //ButtonState
    	//Button end
    
    	class Button{
    		public:
    		//Constructeurs et destructeurs
    		Button();
    		Button(std::string caption,int x=0,int y=0,int iMode=ButtonMode::Active);
    		Button(Button &copy);
    		Button operator=(Button &copy);
    		~Button();
    
    		//Changer le texte du boutton
    		void ChangeText(std::string caption);
    
    		//Place le boutton en (x;y)
    		void Move(int x,int y);
    
    		//Dessine le boutton
    		void Draw(sf::RenderWindow &App);
    
    		//regarde si le point (x;y) est sur le bouton et change le mode si besoin
    		bool IsInside(int x,int y);
    
    		//Chargement de l'image contenant l'interface
    		void LoadGUISchedule(sf::Image *Ptr);
    
    		//Chargement du chargeur de texte
    		void LoadFontManager(Font::Manager *Ptr);
    
    		protected:
    		//Fonctions internes à 'Button'
    			//Charge l'image contenant la police
    			void LoadText(std::string &caption);
    
    			//Place tous les sprites du boutton
    			void SetPosition(int x,int y);
    
    		//Plan de l'interface
    		sf::Image *GUISchedule;
    
    		//Chargeur de polices
    		Font::Manager *myFontManager;
    
    		//cadre des sous image à récuperer dans l'image de la GUI
    		rect subImage[ButtonState::Count][3];
    
    		//Sprites du boutons
    		std::vector<sf::Sprite> SpriteButton;
    		//Sprite du texte
    		sf::Sprite SpriteText;
    
    		//Texte du bouton
    		std::string Text;
    		//Coordonnées
    		int xcoord;
    		int ycoord;
    		//Mode actuel du bouton
    		int Mode;
    		//Etat actuel du bouton
    		int State;
    	};
    
    
    /************//************//************//************/
    /************//************//************//************/
    /************//************//************//************/
    
    	class Manager{
    		public:
    		//Constructeurs et destructeurs
    		Manager();
    		Manager(sf::RenderWindow &App);
    		Manager(Manager &Copy);
    		~Manager();
    
    		//Charge l'image contenant l'outillage grapghique de la GUI
    		void LoadEnv(sf::Image *GUI);
    
    		//Créer un nouveau bouton /**Retourne l'ID du boutton**/
    		int LoadButton(std::string &caption,int x=0,int y=0);
    
    		//Décharge un bouton chargé en mémoire
    		void EraseButton(int ID);
    
    		//Décharge la GUI
    		void Erase();
    
    		//Gestion de la souris (nescessite un appel à chaque tour de le boucle principale
    		void Use();
    
    		protected:
    		//Image contenant les graphismes de la gui
    		sf::Image GuiSchedule;
    		//Fenêtre servant de contexte pour dessiner la GUI
    		sf::RenderWindow *myApp;
    
    		//Boutons chargés
    		std::map<int,Button> myButton;      //C'est cette ligne qui provoque l'erreur
        };
    
    } //Gui
    #endif
    


    Mon fichier .cpp est vide. Mais même lorsqu'il est plein j'obtiens l'erreur suivante :
    /media/sda2/0-Doc-Linux/0-Programation/-2-Projets-Temporaires/test/GUIManager.hpp|129|erreur: type/value mismatch at argument 2 in template parameter list for «template<class _Key, class _Tp, class _Compare, class _Alloc> class std::map"|
    /media/sda2/0-Doc-Linux/0-Programation/-2-Projets-Temporaires/test/GUIManager.hpp|129|erreur:   expected a type, got «Button"|
    /media/sda2/0-Doc-Linux/0-Programation/-2-Projets-Temporaires/test/GUIManager.hpp|129|erreur: patron de l'argument 4 est invalide|
    ||=== Build finished: 3 errors, 0 warnings ===|


    Si quelqu'un a déjà rencontrer cette erreur ou sait la corriger.

    Sur google le problème semblent être présent dans beaucoup d'autre langage et il est donc compliquer de trouver une solution valable dans mon cas. Voilà merci à ceux qui m'aideront.
    • Partager sur Facebook
    • Partager sur Twitter
      15 mai 2008 à 14:25:57

      Essai avec std::map<int,class Button> myButton;
      • Partager sur Facebook
      • Partager sur Twitter
        15 mai 2008 à 14:33:35

        Effectivement ça corrige mon problème dans la map.
        Mais Button n'est pas reconnu comme un type dans le .cpp o_O
        C'est très bizarre.

        GUIManager.cpp :

        #include "/media/sda2/0-Doc-Linux/0-Programation/-Tools/includer.hpp"
        
        #include "GUIManager.hpp"
        
        using namespace Gui;
        
        Button::Button(){
        	GUISchedule = 0;
        	Text = " ";
        	LoadText(Text);
        	Mode = ButtonMode::Active;
        	State = ButtonState::Standard;
        	xcoord = 0;
        	ycoord = 0;
        }
        
        Button::Button(std::string caption,int x,int y,int iMode){
        	GUISchedule = 0;
        	Text = caption;
        	LoadText(Text);
        	Mode = iMode;
        	State = ButtonState::Standard;
        	xcoord = x;
        	ycoord = y;
        }
        
        Button::Button(Button &copy){
        	*this = copy;
        }
        
        Button Button::operator=(Button &copy){
        	*this = copy;
        }
        
        Button::~Button(){
        
        }
        
        void Button::ChangeText(std::string caption){
        	Text = caption;
        	LoadText(Text);
        }
        
        void Button::Move(int x,int y){
        	SetPosition(x,y);
        }
        
        void Button::Draw(sf::RenderWindow &App){
        	//On dessine les sprites du bouton dans l'ordre puis on dessine le sprite du texte
        	std::vector<sf::Sprite>::const_iterator iti = SpriteButton.begin();
        	for ( ;iti != SpriteButton.end();iti++)
        		App.Draw(*iti);
        	App.Draw(SpriteText);
        }
        
        bool Button::IsInside(int x,int y,bool clicked){
        	//Variables délimitants le bouton
        	coord Begin(0,0);
        	coord End(0,0);
        	//iterator constant servant a initialiser les variables délimitants le bouton
        	std::vector<sf::Sprite>::iterator iti = SpriteButton.begin();
        	Begin.x = iti->GetLeft();
        	Begin.y = iti->GetTop();
        	//On place l'iterator en fin de file
        	iti = SpriteButton.end();
        	iti--;
        	End.x = iti->GetLeft() + iti->GetWidth();
        	End.y = iti->GetTop() + iti->GetHeight();
        
        	//On convertit les point x et y en float
        	float fx = (float)x;
        	float fy = (float)y;
        	if (fx >= Begin.x && fx <= End.x)
        		if (fy >= Begin.y && fy <= End.y)
        			return true;
        
        	return false;
        }
        
        void Button::SetPosition(int x,int y){
        	//On place les différents sprites du bouton
        	for (unsigned int i=0;i<SpriteButton.size();i++)
        		SpriteButton[i].Move(x+i*ButtonSize::Width,y);
        	//On place le sprite contenant le texte au milieu de l'image
        
        	//Variables délimitants le bouton
        	coord Begin(0,0);
        	coord End(0,0);
        	//iterator constant servant a initialiser les variables délimitants le bouton
        	std::vector<sf::Sprite>::iterator iti = SpriteButton.begin();
        	Begin.x = iti->GetLeft();
        	Begin.y = iti->GetTop();
        	//On place l'iterator en fin de file
        	iti = SpriteButton.end();
        	iti--;
        	End.x = iti->GetLeft() + iti->GetWidth();
        	End.y = iti->GetTop() + iti->GetHeight();
        
        	//Variables initialisées à la taille du sprite de texte
        	coord Size(SpriteText.GetWidth(),SpriteText.GetHeight());
        
        	SpriteText.Move(Begin.x + (End.x-Begin.x)/2 - Size.x/2, Begin.y + (End.y-Begin.y)/2 - Size.y/2);
        }
        
        void Button::LoadGUISchedule(sf::Image *Ptr){
        	GUISchedule = Ptr;
        }
        
        void Button::LoadFontManager(Font::Manager *Ptr){
        	myFontManager = Ptr;
        }
        
        void Button::LoadText(std::string &caption){
        	SpriteText = myFontManager->GetText(caption);
        }
        
        Manager::Manager(){
        	myButton.clear();
        	myApp = 0;
        	NbButton = 0;
        }
        
        Manager::Manager(sf::RenderWindow &App){
        	myButton.clear();
        	myApp = &App;
        	NbButton = 0;
        }
        
        Manager::Manager(Manager &copy){
        	myButton = copy.myButton;
        	myApp = copy.myApp;
        	GuiSchedule = copy.GuiSchedule;
        	NbButton = copy.NbButton;
        }
        
        void Manager::LoadEnv(sf::Image *GUI){
        	GuiSchedule = *GUI;
        }
        
        void Manager::LoadEnv(std::string str){
        	GuiSchedule.LoadFromFile(str);
        }
        
        int Manager::LoadButton(std::string caption,int x,int y){
            Button NewButton
        	myButton[NbButton] = NewButton;
        	NbButton++;
        	return NbButton-1;
        }
        
        void Manager::EraseButton(int ID){
        	myButton.erase(ID);
        }
        
        void Manager::Use(){
        
        }
        



        Edit: Je viens de remarquer que Button était vu par mon compilo comme une structure... pourtant j'ai bien class Button.
        Edit2: Le titre de ce topic ne correspont plus vraiment au problème final, je met donc en résolu
        Merci!
        • Partager sur Facebook
        • Partager sur Twitter
          15 mai 2008 à 15:03:41

          En relisant un peu mieux, car il y avait un soucis à préciser que c'était une classe, je comprends le fond du problème : tu as un enum avec une valeur "Button" dans le même namespace que Button.

          Ca perd un peu le compilateur, qui ne sait plus si tu fait référence à la valeur d'enum (qui n'est pas un type mais une valeur) ou à ta classe.

          (et sinon, struct ou class, en C++, c'est strictement identique à l'exception de l'accessibilité par défaut des membres).
          • Partager sur Facebook
          • Partager sur Twitter
            15 mai 2008 à 15:12:26

            Ah oui! Merci beaucoup je l'avais oublié cette enum!
            Tout ça pour ça! Bon bah tout devrait rentrer dans l'ordre maintenant.

            Au revoir
            • Partager sur Facebook
            • Partager sur Twitter

            type/value mismatch at argument 2 in template....

            × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
            × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
            • Editeur
            • Markdown