Problème de template avec une queue
Bonjour à tous.
J'essaie de créer un système de file d'évenement pour envoyer des messages entres des classes .
Voici le code que j'ai crée (c'est du test , donc c'est moche et ca pue :aie: )
Code:
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 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172
|
#include <iostream>
#include <queue>
using namespace std;
class Event;
template <class T> class Module;
class GUI;
class Game;
template <class Type> class RealEvent;
template<typename T> class CSingleton
{
public:
static T* GetInstance(queue<Event*>& queue)
{
if(singleton==0)
{
singleton = new T(queue);
}
return singleton;
}
static T* GetInstance(void)
{
if(singleton==0)
{
throw;
}
return singleton;
}
static void Kill()
{
if(singleton!=0)
{
delete singleton ;
}
}
protected:
CSingleton()
{
cout<<"Singleton crée"<<endl;
}
virtual ~CSingleton()
{
cout<<"Singleton détruit"<<endl;
}
static T *singleton;
};
template <typename T> T* CSingleton<T>::singleton = 0;
class Event
{
public:
virtual void ProcessEvent(void) = 0 ;
virtual ~Event(){}
};
template <class Type> class RealEvent : public Event
{
public:
virtual void ProcessEvent(void)
{
Type::GetInstance()->TraiterEvent(this);
}
string GetCommande(void){return m_commande;}
RealEvent(string commande)
{
m_commande=commande;
}
virtual ~RealEvent(){}
private:
string m_commande;
};
template <class T> class Module
{
protected:
queue<Event*>& m_queueevent;
public:
virtual void TraiterEvent(RealEvent<T>* event)=0;
virtual void Test()=0;
Module(queue<Event*>& queue):m_queueevent(queue){}
virtual ~Module(){}
};
class Game : public Module<Game>,public CSingleton<Game>
{
friend class CSingleton<Game>;
public:
virtual void TraiterEvent(RealEvent<Game>* event)
{
cout<<"Commande Game"<<event->GetCommande();
//delete event;
}
Game(queue<Event*>& queuep):Module<Game>(queuep){}
virtual ~Game(){}
virtual void Test()
{
RealEvent<GUI>* evt=new RealEvent<GUI>("test 0");
m_queueevent.push(evt);
}
};
class GUI : public Module<GUI>,public CSingleton<GUI>
{
friend class CSingleton<GUI>;
public:
virtual void TraiterEvent(RealEvent<GUI>* event)
{
cout<<"Commande GUI"<<event->GetCommande();
// delete event;
}
virtual ~GUI(){}
GUI(queue<Event*>& queuep):Module<GUI>(queuep){}
virtual void Test()
{
RealEvent<Game>* evt=new RealEvent<Game>("test 1");
m_queueevent.push(evt);
}
};
int main (int argc,char* argv[])
{
queue<Event*> queueevt;
Game::GetInstance(queueevt)->Test();
GUI::GetInstance(queueevt)->Test();
const int size = queueevt.size();
cout<<size<<endl;
Event* e;
for(int i=0;i<size;i++)
{
e=queueevt.front();
queueevt.pop();
e->ProcessEvent();
delete e;
}
Game::Kill();
GUI::Kill();
return 0;
} |
Et voici les erreurs :
Citation:
erreur: no matching function for call to ‘std::queue<Event*, std::deque<Event*, std::allocator<Event*> > >::push(RealEvent<GUI>&)’
/usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_queue.h:214: note: candidats sont: void std::queue<_Tp, _Sequence>::push(const typename _Sequence::value_type&) [with _Tp = Event*, _Sequence = std::deque<Event*, std::allocator<Event*> >]
test.cpp: In member function ‘virtual void GUI::Test()’:
test.cpp:137: erreur: no matching function for call to ‘std::queue<Event*, std::deque<Event*, std::allocator<Event*> > >::push(RealEvent<Game>&)’
/usr/lib/gcc/i386-redhat-linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_queue.h:214: note: candidats sont: void std::queue<_Tp, _Sequence>::push(const typename _Sequence::value_type&) [with _Tp = Event*, _Sequence = std::deque<Event*, std::allocator<Event*> >]
test.cpp: In function ‘int main(int, char**)’:
test.cpp:161: erreur: valeur void n'a pas été ignorée comme elle aurait dû l'être
Les 2 premières sont lié au push dans Game::Test et dans GUI::Test.
Je ne vois pas pourquoi elle apparaisent.
Résolue
Enfin la 3eme (erreur: valeur void n'a pas été ignorée comme elle aurait dû l'être) je ne vois pas d'où elle sort. 8O
Je tire mon chapeau très bas a celui qui me met sur la voie pour les résoudre
Merci.
Edit: désolé pour le code un peu long. :aie:
Edit2 : je croit avoir vu dans la signature de quelqu'un site qui traduit les erreurs incompréhensible de la STL en quelque chose de buvable.Quelqu'un aune URL ou j'ai rêvé ?