Bonjour,

J'essaye de définir une nouvelle classe héritant d'une autre, dans laquelle je redéfinie une fonction. Le compilateur m'indique l'erreur suivante que je ne comprends pas la signification:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
client1.cpp:16: erreur: cannot define member function ‘cogitantcs::Client::Operation’ within ‘m_client’
Voici le code que j'ai écris, et si vous avez besoin d'autres détails vous me le dites.
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
 
// To use with server_init
#include <iostream>
#include "cogitant/cogitant.h"
#include "cogitant/cs/ccxx.h"
#include "cogitant/cs/client.h"
 
using namespace std;
using namespace cogitant;
using namespace cogitantcs;
 
 
class m_client: public Client
{
 
public:
void Client::Operation(iSet i, bool imm)
{
	createPendingQuery("qoperation", "env", intToStr(m_idenv), "igp", intToStr(i));
	if (imm)
	{
		executePendingQueries();}
        }
 
};
 
int main(int , char* [])
{
    return 0;
}
voici le fichier client.h
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
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
 
// ==============
//   CoGITaNT 5 
// ==============
 
/** \file cs/client.h
 *      Fonctionnalités de client (accès à un serveur).
 *      Déclaration de la classe cogitantcs::Client.
 *      \author David Genest.
 */
 
#ifndef CogitantCS_Client_h
#define CogitantCS_Client_h
 
#include "cogitant/common.h"
#include "cogitant/cs/base.h"
#include "cogitant/xmldocument.h"
#include "cogitant/support.h"
#include "cogitant/supportobject.h"
#include "cogitant/graph.h"
#include "cogitant/rule.h"
#include "cogitant/environment.h"
#include "cogitant/partialorder.h"
#include "cogitant/allocator.h"
#include "cogitant/propertyset.h"
 
namespace cogitantcs {
 
class EnvironmentAllocatorClient;
template <class SetContent> class SetClient;
 
/// Diverses vérifications sur les fonctionnalités de client.
#define CGA_CLIENT_MISC 1
 
/** \class Client cs/client.h "cogitant/cs/client.h"
 *      %Client.
 *      Un client est connecté à un serveur et permet d'interroger ce dernier pour fournir un accès aux environnements présents sur le serveur comme s'il s'agissait d'environnements locaux au client.
 *      Un client ouvre la connexion vers le serveur dès le constructeur (OperationCSIO::open()) et ferme la connexion dans le destructeur. Donc les méthodes open() et close() ne doivent être utilisées que dans le cas ou on désire explicitement couper la communication avec le serveur pour la réouvrir plus tard.
 *      \see \ref prog_cs.
 */
class CGTDLLEXPORT_CS Client: public Base
{
private:
	/// Environnement géré par le client.
	cogitant::Environment* m_environment;
	/// Identificateur de l'environnement dans le serveur.
	cogitant::iSet m_idenv;
	/// Stockage des requêtes en attente.
	cogitant::XmlDocument m_pendingqueries;
	/// Stockage de la dernière réponse reçue du serveur.
	cogitant::XmlDocument m_answer;
	/// Informations sur le serveur.
	cogitant::PropertySet m_serverinfo;
	/// Stockage du dernier résultat de la requête de comparaison.
	cogitant::PartialOrder::Comparison m_comparisonresult;
	///     Les environnements créés dans ce client ont un support local.
	bool m_localsupport;
	///     Les environnements créés dans ce client ont des graphes locaux.
	bool m_localobjects;
 
public:
/** @name Constructeurs - destructeur. */
//@{
	/** Constructeur par défaut.
         *      \param opeio opérations d'entrées/sorties utilisées par le client pour communiquer avec le serveur.
         *      \param localsupport si \c true le support est local au client, et le serveur n'est jamais interrogé pour obtenir le support. Si \c false il ne faut pas charger un support dans l'environnement associé au client, car le support de l'environnement est celui du serveur.
         *      \param localobjects si \c true les objets de l'environnement sont locaux, et le serveur n'est jamais interrogé pour obtenir les objets. */
	Client(OperationCSIO * opeio, bool localsupport, bool localobjects);
	/** Destructeur.
         *      \warning La destruction du client ne provoque pas la destruction de l'environnement (de cette façon, il est possible de couper la connexion avec le server et de conserver l'environnement obtenu, dans ce cas, il est toutefois impossible d'obtenir de nouvelles informations du serveur). */
	virtual	~Client();
//@}
 
protected:
	/** Efface l'ensemble des requêtes en attente. */
	void clearPendingQueries();
	/** Retourne l'identificateur d'ensemble correspondant à l'ordre partiel passé. */
	cogitant::iSet partialOrderToISet(cogitant::PartialOrder const * po);
 
	/** Prise en compte de la réponse reçue du serveur.
         *      Le noeud \e node de la réponse \e m_answer est interprété et l'action correspondante est exécutée, à condition que ce noeud correponde à une opération standard. Il est donc possible de redéfir cette méthode dans les sous-classes pour gérer des réponses particulières ou effectuer des traitements spéciaux sur les réponses standard. */
	virtual	void execAnswer(cogitant::XmlDocument::Element const * node);
	/** Prise en compte d'une réponse environment. */
	virtual void execAnswerEnvironment(cogitant::XmlDocument::Element const * node);
	/** Prise en compte d'une réponse setcontent. */
	virtual void execAnswerSetContent(cogitant::XmlDocument::Element const * node);
	/** Prise en compte d'une réponse graph. */
	virtual void execAnswerGraph(cogitant::XmlDocument::Element const * node);
	/** Prise en compte d'une réponse rule. */
	virtual void execAnswerRule(cogitant::XmlDocument::Element const * node);
	/** Prise en compte des réponses immediateless, immediategreater et comparison. */
	virtual void execAnswerPartialOrder(cogitant::XmlDocument::Element const * node);
	/** Prise en compte d'une réponse bannedtypes. */
	virtual void execAnswerBannedTypes(cogitant::XmlDocument::Element const * node);
 
	/** Envoi d'une requête au serveur. */
	virtual	void sendQuery(cogitant::XmlDocument const & query);
	/** Lecture d'une réponse envoyée par le serveur. */
	virtual	void readAnswer(cogitant::XmlDocument & answer);
	/** Ouverture de la communication avec le serveur. */
	virtual	void open();
	/**     Création d'un allocateur pour un environnement. */
	virtual	EnvironmentAllocatorClient * newEnvironmentAllocator();
 
public:
/** @name Modifications */
//@{
	/** Choix de l'environnement parmi ceux offerts par le serveur.
         *      Cette méthode (ou l'autre de même nom) doit être obligatoirement appelée avant tout accès au serveur.
         *      \param ie identificateur de l'environnement offert par le serveur.
         *      \exception cogitantcs::ExceptionClient si aucun environnement de cet identificateur n'est offert par le serveur. */
	void setServerEnvironment(cogitant::iSet ie);
	/** Choix de l'environnement parmi ceux offerts par le serveur.
         *      Cette méthode (ou l'autre de même nom) doit être obligatoirement appelée avant tout accès au serveur.
         *      \param en nom de l'environnement offert par le serveur.
         *      \exception cogitantcs::ExceptionClient s'il n'existe aucun environnement de ce nom.
         *      \sa OpeServerEnvironment. */
	void setServerEnvironment(std::string const & en);
	/** Fermeture de la connexion avec le serveur.
         *      \warning Cette méthode doit être utilisée avec précaution car après appel à cette méthode, le lien avec le serveur est interrompu, ce qui signifie que si le client a besoin de faire un accès au serveur pour transférer un objet ou le résultat d'une opération, un exception sera levée car la connexion ne sera plus active. Cette méthode ne doit donc être utilisée que dans le cas où il est certain que plus aucune requête ne sera adressée au serveur. Dans ce cas, le serveur peut être libéré de la gestion de cette connextion (dans le cas d'un lien en mode connecté tel que Client_TCP). */
	virtual	void close();
	/** Ajoute une requête à l'ensemble des requêtes en attente.
         *      \return le noeud (Element) ajouté à la requête en attente. */
	cogitant::XmlDocument::Element * createPendingQuery(std::string const & name);
	/** Ajoute une requête à l'ensemble des requêtes en attente.
         *      \param name nom de l'ordre.
         *      \param p1 nom du premier paramètre.
         *      \param v1 valeur du premier paramètre.
         *      \param p2 nom du deuxième paramètre.
         *      \param v2 valeur du second paramètre.
         *      \param p3 nom du troisième paramètre.
         *      \param v3 valeur du troisième paramètre. */
	cogitant::XmlDocument::Element * createPendingQuery(std::string const & name, std::string const & p1, std::string const & v1, std::string const & p2="", std::string const & v2="", std::string const & p3="", std::string const & v3="");
 
	/** Environnement géré. */
	cogitant::Environment * environment();
//@}
 
/** @name Accesseurs */
//@{
	/** Environnement géré. */
	cogitant::Environment const * environment() const;
	/** Réponse reçue du serveur. */
	cogitant::XmlDocument const & answer() const;
	/** Informations sur le serveur. */
	cogitant::PropertySet const & serverProperties() const;
	/** Identificateur de l'environnement côté serveur. */
	cogitant::iSet serverEnvironmentISet() const;
	/** Nombre d'environnements gérés par le serveur. */
	cogitant::nSet serverEnvironments() const;
//@}
 
/** @name Requêtes.
 *      Les requêtes peuvent être effectuées en mode bloquant ou différé. Toutes les requêtes ont un paramètre \a imm (\e true par défaut) qui détermine le caractère "bloquant" de la requête. Si la valeur \e true est passée, l'appel à la méthode ne se termine pas tant que la réponse n'a pas été reçue par le serveur et l'action correspondante effectuée (création d'un type de concept, d'un graphe, etc.). Au contraire, si la valeur \e false est passée, la requête est mémorisée et n'est envoyée au serveur que quand la méthode executePendingQueries() est appelée, cette méthode attend aussi la réception de la réponse du serveur et execute les opérations correspondantes. Il est évidemment préférable d'utiliser cette deuxième méthode d'accès quand le serveur est disponible à travers un réseau et qu'un grand nombre de requêtes doivent être transmises. Par contre, pour les méthodes qui ont une valeur de retour, cette valeur de retour n'a de sens que dans le cas où la requête est exécutée immédiatement. <p>
 *      Ces méthodes peuvent lever l'exception cogitantcs::ExceptionClient dans le cas d'un problème de communication avec le serveur. A noter que les versions "non bloquantes" des requêtes ne peuvent provoquer une telle exception car la requête est simplement stockée.<p>
 *      La valeur de retour de la plupart de ces méthodes est l'identifiant du noeud ajouté à la requête en cours de construction. Évidemment, cette valeur n'a aucun intérêt si la requête est bloquante (imm = true). Dans ce cas, la requête est aussitot transmise au serveur et la réponse est attendue. Par contre, si la requête est mémorisée, la valeur de retour peut servir à rajouter des attributs à l'élément correspondant à la requête.<p>
 *      Une requête ne peut être exécutée sur le serveur que dans le cas où il connait une opération (cogitantcs::OpeServer) qui est capable de traiter cette requête. Selon la configuration du serveur, il est donc possible que certaines des requêtes ne soient pas utilisables. */
//@{
	/** Requête d'interrogation d'un élément d'un ensemble (dans l'environnement courant).
         *      \param n type de requête (<tt>qconcepttype</tt>, etc.).
         *      \param i identificateur de l'élément devant être transféré ou ISET_NULL pour transférer tous les éléments.
         *      \param imm exécution immédiate.
         *      \return Elément XML codant la requête.
         *      \sa OpeServerSetContent. */
	cogitant::XmlDocument::Element * getSetContent(std::string const & n, cogitant::iSet i, bool imm = true);
	cogitant::XmlDocument::Element * getSupportObject(SetClient<cogitant::ConceptType*> const * s, cogitant::iSet i, bool imm = true);
	cogitant::XmlDocument::Element * getSupportObject(SetClient<cogitant::RelationType*> const * s, cogitant::iSet i, bool imm = true);
	cogitant::XmlDocument::Element * getSupportObject(SetClient<cogitant::NestingType*> const * s, cogitant::iSet i, bool imm = true);
	cogitant::XmlDocument::Element * getSupportObject(SetClient<cogitant::Individual*> const * s, cogitant::iSet i, bool imm = true);
	/** Interrogation de l'ensemble des éléments d'un ensemble du support.
         *      Demande le transfert vers le client du contenu complet d'un ensemble d'éléments du support. Cette méthode ne sert qu'à optimiser les échanges d'information : plutot que de demander un par un les objets du support, l'exécution de cette méthode les demande tous en une seule opération, ce qui est beaucoup plus rapide.
         *      \param s 0 : tous les ensembles, 1 : types de concepts, 2 : types de relations, 3 : types d'emboîtement, 4 : marqueurs individuels.
         *      \param imm exécution immédiate.
         *      \return Element XML codant la requête.
         *      \sa OpeServerSetContent, getEnvironmentObjects(). */
	cogitant::XmlDocument::Element * getSupportObjects(int s=0, bool imm=true);
 
	/** Transfert d'un objet de l'environnement du serveur vers le client.
         *      \param i identificateur de l'objet à transférer dans le serveur.
         *      \param dest identificateur de l'objet à la réception. La valeur ISET_NULL repère qu'à la réception, l'objet est stocké à la même position que dans le serveur.
         *      \param imm exécution immédiate.
         *      \return Element XML codant la requête.
         *      \sa OpeServerSetContent, getEnvironmentObjects(). */
	cogitant::XmlDocument::Element * getEnvironmentObject(cogitant::iSet i, cogitant::iSet dest=cogitant::ISET_NULL, bool imm = true);
	/** Interrogation de l'ensemble des objets de l'environnement.
         *      \param imm exécution immédiate.
         *      \return Element XML codant la requête.
         *      \sa OpeServerSetContent, getSupportObjects(). */
	cogitant::XmlDocument::Element * getEnvironmentObjects(bool imm = true);
 
	/** Requête d'interrogation des éléments immédiatement inférieurs.
         *      \param s ordre partiel interrogé.
         *      \param i identificateur de l'élément devant être interrogé ou ISET_NULL pour recevoir les éléments immédiatement plus petits de tous les éléments de l'ordre partiel.
         *      \param imm exécution immédiate.
         *      \return Element XML codant la requête.
         *      \sa OpeServerImmediateLG, getImmediateLess(). */
	cogitant::XmlDocument::Element * getImmediateLess(cogitant::PartialOrder const * s, cogitant::iSet i, bool imm = true);
	/** Requête d'interrogation des éléments immédiatement inférieurs.
         *      \see getImmediateLess(). */
	cogitant::XmlDocument::Element * getImmediateGreater(cogitant::PartialOrder const * s, cogitant::iSet i, bool imm = true);
	/** Requête d'interrogation de l'ordre existant entre deux éléments d'un ordre partie.
         *      \param s ordre partiel interrogé.
         *      \param i identificateur à comparer.
         *      \param j identificateur à comparer.
         *      \return résultat de la comparaison.
         *      \sa OpeServerComparison. */
	cogitant::PartialOrder::Comparison getComparison(cogitant::PartialOrder const * s, cogitant::iSet i, cogitant::iSet j);
	/** Requête d'interrogation des propriétés du serveur.
         *      Habituellement, il n'est pas nécessaire d'appeler explicitement cette méthode.
         *      \sa serverProperties(), serverEnvironments, OpeServerServer. */
	void getServerInfo(bool imm=true);
	/** Met à jour l'objet du serveur avec l'objet local.
         *      \param i identificateur local de l'objet.
         *      \param dest identificateur de l'objet pour le serveur (ISET_NULL pour transférer l'objet avec le même identificateur que dans le client).
         *      \param imm exécution immédiate.
         *      \sa OpeServerCommitEnvironmentObject. */
	void commitEnvironmentObject(cogitant::iSet i, cogitant::iSet dest=cogitant::ISET_NULL, bool imm = true);
	/** Création d'un nouvel environnement dans le serveur.
         *      \param optorderc Optimisation automatique de l'ordre sur les types de concepts (après un chargement à partir d'un fichier). Si true, l'ensemble des types de concepts (et l'ordre) ne peut être modifié après un chargement.
         *      \param optorderr Optimisation automatique de l'ordre sur les types de relations (après un chargement à partir d'un fichier). Si true, l'ensemble des types de relations (et l'ordre) ne peut être modifié après un chargement.
         *      \param optordern Optimisation automatique de l'ordre sur les types d'emboîtements (après un chargement à partir d'un fichier). Si true, l'ensemble des types d'emboîtements (et l'ordre) ne peut être modifié après un chargement.
         *      \param imm exécution immédiate.
         *      \return identificateur de l'environnement créé (dans le cas où \a imm = <tt>true</tt>).
         *      \sa OpeServerNewEnvironment. */
	cogitant::iSet newEnvironment(bool optorderc=true, bool optorderr=true, bool optordern=true, bool imm=true);
	/** Création d'un nouvel objet d'environnement dans le serveur.
         *      \param ot type d'objet à créer : graphe (par défaut) ou règle.
         *      \param imm exécution immédiate.
         *      \result identificateur de l'objet créé (dans le cas où \a imm = <tt>true</tt>).
         *      \warning Habituellement, l'appel à cette méthode devrait être suivi d'un appel à refreshEnvironment().
         *      \sa OpeServerNewEnvironmentObject. */
	cogitant::iSet newEnvironmentObject(cogitant::EnvironmentObject::Type ot = cogitant::EnvironmentObject::OT_GRAPH, bool imm=true);
	/** Destruction d'un objet de l'environnement.
         *      \param i Identificateur de l'objet à détruire.
         *      \param imm Exécution immédiate.
         *      \result \c true si l'objet a été correctement détruit et \c false si l'objet n'a pu être détruit. Attention, la méthode retourne \c false si \a imm vaut \c false. En effet, si l'exécution n'est pas immédiate, la requête de destruction est stockée dans le document contenant les requêtes en attentes, mais elle n'est pas expédiée immédiatement au serveur. Il est donc impossible de connaître à ce moment le résultat que retournera le serveur.
         *      \sa OpeServerDeleteEnvironmentObject. */
	bool deleteEnvironmentObject(cogitant::iSet i, bool imm=true);
	/** Création d'un nouveau type ou marqueur.
         *      \param ot type d'objet à créer ('c' type de concept, 'r' relation, 'n' emboîtement, 'i' marqueur individuel).
         *      \param imm exécution immédiate.
         *      \return identificateur du nouvel objet (dans le cas où \a imm = <tt>true</tt>).
         *      \warning Habituellement, l'appel à cette méthode devrait être suivi d'un appel à refreshEnvironment().
         *      \sa OpeServerNewSupportObject. */
	cogitant::iSet newSupportObject(char ot, bool imm=true);
	/** Mise à jour de l'objet du serveur avec l'objet local.
         *      \param ot type d'objet à mettre à jour ('c' type de concept, 'r' relation, 'n' emboîtement, 'i' marqueur individuel).
         *      \param i identificateur de l'objet à mettre à jour.
         *      \param imm exécution immédiate.
         *      \sa OpeServerCommitSupportObject. */
	void commitSupportObject(char ot, cogitant::iSet i, bool imm=true);
	/**     Mise à jour d'un ordre partiel du serveur avec celui du client.
         *      \param ot ordre partiel à mettre à jour ('c' type de concept, 'r' relation, 'n' emboîtement).
         *      \param i1 identificateur d'un type dans l'ordre partiel.
         *      \param i2 identificateur d'un type dans l'ordre partiel. L'appel à cette méthode modifie l'information <code>i1 > i2</code>. L'ordre qui est envoyé au serveur dépend de la valeur locale de <code>i1 > i2</code>.
         *      \param imm exécution immédiate.
         *      \sa OpeServerCommitImmediateLess. */
	void commitImmediateLess(char ot, cogitant::iSet i1, cogitant::iSet i2, bool imm=true);
	/** Chargement d'un support dans le serveur.
         *      \param sn nom du fichier support. Ce fichier est chargé par le serveur, il doit donc être accessible sur le poste qui execute le serveur.
         *      \param env identificateur de l'environnement (serveur) qui doit charger le support. Si ISET_NULL est passé (par défaut), c'est l'environnement sélectionné par le client (par setServerEnvironment()) qui charge le support.
         *      \param imm exécution immédiate.
         *      \return <code>""</code> si le support a été correctement chargé ou l'intitulé de l'erreur si une erreur a été rencontrée par le serveur lors du chargement (dans le cas où \a imm = <tt>true</tt>).
         *      \warning Dans le cas où l'environnement sélectionné par le client charge le support, l'appel à cette méthode devrait être suivi d'un appel à refreshEnvironment().
         *      \sa OpeServerLoadSupport. */
	std::string loadSupport(std::string const & sn, cogitant::iSet env=cogitant::ISET_NULL, bool imm=true);
	/**     Sauvegarde d'un support côté serveur.
         *      \param sn nom du fichier support.
         *      \param imm exécution immédiate ou pas.
         *      \return <code>""</code> si le support a été correctement sauvé ou l'intitulé de l'erreur.
         *      \sa OpeServerSaveSupport. */
	std::string saveSupport(std::string const & sn, bool imm=true);
	/** Chargement d'un support dans le serveur à partir du support du client.
         *      \result <code>""</code> si le support a été correctement chargé ou l'intitulé de l'erreur si une erreur a été rencontrée par le serveur lors de l'analyse du support envoyé par le client.
         *      \warning Si le support du client est issu du serveur, un grand nombre de requêtes peuvent être envoyées au serveur pour récupérer entièrement le support... afin de lui renvoyer. Il est donc raisonnable d'utiliser cette méthode dans le cas où le support est local au client, mais pas dans le cas où le support est issu du serveur. */
	std::string commitSupport(bool imm=true);
	/** Chargement de graphes dans le serveur.
         *      \warning Habituellement, l'appel à cette méthode devrait être suivi d'un appel à refreshEnvironment().
         *      \result identificateurs des graphes chargés.
         *      \sa OpeServerLoadGraphs. */
	std::vector<cogitant::iSet> loadGraphs(std::string const & gn, bool imm=true);
	/**     Sauvegarde d'un graphe (ou d'un règle) côté serveur.
         *      \param gn nom du fichier (il s'agit du nom du fichier pour le serveur, si un nom relatif est donné, ce sera relativement au répertoire courant du serveur).
         *      \param i identificateur du graphe dans l'environnement courant du client.
         *      \param imm exécution immédiate ou pas.
         *      \result <code>""</code> si le graphe a été correctement sauvegardé, ou l'intitulé de l'erreur. (toujours "" si \a imm vaut faux).
         *      \sa OpeServerSaveEnvironmentObjects. */
	std::string saveEnvironmentObject(std::string const & gn, cogitant::iSet i, bool imm=true);
	/**     Sauvegarde de graphes (ou règles) côté serveur.
         *      \param gn nom du fichier (il s'agit du nom du fichier pour le serveur, si un nom relatif est donné, ce sera relativement au répertoire courant du serveur).
         *      \param ids identificateur du graphe dans l'environnement courant du client.
         *      \param imm exécutoin immédiate ou pas.
         *      \result <code>""</code> si le graphe a été correctement sauvegardé, ou l'intitulé de l'erreur. (toujours "" si \a imm vaut faux).
         *      \sa OpeServerSaveEnvironmentObjects. */
	std::string saveEnvironmentObjects(std::string const & gn, std::vector<cogitant::iSet> const & ids, bool imm=true);
	/** Destruction d'un environnement.
         *      \warning Plus aucun autre accès à l'environnement ne doit être fait après appel à cette méthode.
         *      \result \c true si l'environnement a été correctement détruit et \c false si l'environnement n'a pu être détruit. Attention, la méthode retourne \c false si \a imm vaut \c false.
         *      \sa OpeServerDeleteEnvironment. */
	bool deleteEnvironment(cogitant::iSet i=cogitant::ISET_NULL, bool imm=true);
	/** Force un rafraichissement de l'environnement depuis le serveur.
         *      Cette méthode doit être appelée pour prendre en compte de nouveaux objets de l'environnement créés dans le serveur ainsi qu'une éventuelle mise à jour de la taille du support. Après appel à cette méthode, le nombre d'objets de l'environnement est à nouveau synchronisé avec le serveur. */
	void refreshEnvironment(bool imm=true);
	/** Force un rafraichissement depuis le serveur d'un élément de l'environnement.
         *      Le rafraichissement n'est pas effectué immédiatement, mais uniquement lors du premier accès à l'objet en question.
         *      \param i identificateur de l'objet de l'environnement à refraichir, ou ISET_NULL, si tous les objets doivent être rafraichis.
         *      \warning Si des modifications ont été effectuées sur l'objet local, et que ces modifications n'ont pas été répercutées sur le serveur, alors ces modifications sont perdues car l'objet local est supprimé. */
	void refreshEnvironmentObject(cogitant::iSet i = cogitant::ISET_NULL);
//@}
 
	/** Envoi des requêtes en attente au serveur et attente de la réponse. */
	void executePendingQueries();
};
 
/** \class SupportAllocatorClient cs/client.h "cogitant/cs/client.h"
 *      Allocateur pour les membres de Support dans un client.
 *      Cette classe diffère de cogitant::SupportAllocator par le fait que les ensembles (de types de concepts, de types de relations, de types d'emboîtements, de marqueurs individuels) et les ordres partiels alloués sont les versions "client" des classes, afin de permettre la communication avec le serveur. */
class CGTDLLEXPORT_CS SupportAllocatorClient: public cogitant::SupportAllocator
{
private:
	/** %Client auquel est rattaché l'allocateur. */
	Client * m_client;
 
public:
	/** Constructeur.
         *      \param client %Client auquel est rattaché l'allocator.
         *      Cette information doit être connue au moment de l'exécution des méthodes d'allocation afin de créer des \e Set reliés au serveur par l'intermédiaire de ce client.*/
	SupportAllocatorClient(Client * client);
/** @name Allocation. */
//@{	
	cogitant::Set<cogitant::ConceptType*>* allocCTypes() const;
	cogitant::Set<cogitant::RelationType*>* allocRTypes() const;
	cogitant::Set<cogitant::NestingType*>* allocNTypes() const;
	cogitant::Set<cogitant::Individual*>* allocIndividuals() const;
	cogitant::PartialOrder* allocCOrder() const;
	cogitant::PartialOrder* allocROrder() const;
	cogitant::PartialOrder* allocNOrder() const;
//@}
/** @name Effacement. */
//@{
	void clearCTypes(cogitant::Set<cogitant::ConceptType*> * s) const;
	void clearRTypes(cogitant::Set<cogitant::RelationType*> * s) const;
	void clearNTypes(cogitant::Set<cogitant::NestingType*> * s) const;
	void clearIndividuals(cogitant::Set<cogitant::Individual*> * s) const;
//@}
};
 
/** \class EnvironmentAllocatorClient cs/client.h "cogitant/cs/client.h"
 *      Allocateur pour les membres de Environment dans un client.
 *      Cette classe diffère de cogitant::EnvironmentAllocator par le fait que le support créé est muni d'un allocateur de type SupportAllocatorClient. */
class CGTDLLEXPORT_CS EnvironmentAllocatorClient: public cogitant::EnvironmentAllocator
{
private:
	/** %Client auquel est rattaché l'allocateur. */
	Client * m_client;
	/** %Support local.
         *      Si vrai, le support est créé localement, et son allocateur est celui par défaut. Sinon (par défaut), le support est distant est récupéré dynamiquement sur le serveur, et l'allocateur des supports créés est m_supportallocator. */
	bool m_supportlocal;
	/** Objets locaux.
         *      Si vrai, seul le support est récupéré sur le serveur : les objets sont locaux (faux par défaut). */
	bool m_objectslocal;
 
public:
	/** Constructeur.
         *      \param client %Client auquel est rattaché l'allocator.
         *      Cette information doit être connue au moment de l'exécution des méthodes d'allocation afin de créer un cogitant::Support muni d'un SupportAllocatorClient relié au bon client. */
	EnvironmentAllocatorClient(Client * client);
	/** Destructeur. */
	~EnvironmentAllocatorClient();
 
protected:
	/**     Construction d'un nouveau allocateur de support pour un environnement créé par l'objet courant. */
	virtual	SupportAllocatorClient * newSupportAllocator() const;
 
public:
/** @name Allocation. */
//@{	
	cogitant::Support* allocSupport() const;
	cogitant::Set<cogitant::EnvironmentObject*>* allocObjects() const;
//@}
/** @name Effacement. */
//@{
	void clearObjects(cogitant::Set<cogitant::EnvironmentObject*>* s) const;
	void replaceObject(cogitant::Set<cogitant::EnvironmentObject*>* s, cogitant::iSet i, cogitant::EnvironmentObject* o) const;
//@}
 
	/** Stockage des objets.
         *      Si \c true les objets (graphes et règles) sont stockés sur le client, sinon (ou si cette méthode n'est pas appelée) les objets accessibles sont ceux du serveur.
         *      \warning Cette méthode doit être appelée avant l'allocation de l'ensemble d'objets. */
	void localObjects(bool local=true);
	/** Stockage du support.
         *      Si \c true le support est stocké sur le client, sinon (ou si cette méthode n'est pas appelée) le support est celui du serveur.
         *      \warning Cette méthode doit être appelée avant l'allocation du support. */
	void localSupport(bool local=true);
};
 
}
#endif
 
Merci