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 )
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
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 :
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.

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.

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é ?