Bonjour !

Alors j'ai 2 petits problèmes, le premier, au niveau de l'écriture d'un template:

Avant j'avais dans ma classe
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
	int GetHeader();
	int GetAction();
	int ReadInt();
	long ReadLong();
	std::string ReadString();
Et en passant sur le chapitre templates de mon bouquin, je me suis dis que je devais changer ca !

Ma classe:
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
 
class Packet {
private:
	int index;
	queue<byte> *bytes;
public:
	Packet();
	Packet(char &s);
	~Packet();
	template<typename T>void read(T &buf);
	void Next();
	Packet& operator+(long l);
	Packet& operator+(int i);
	Packet& operator+(char *s);
	Packet& operator+(byte b);
 };
 
int substr(char *s, int start, int length);
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
 
Packet::~Packet() {
	//delete this;
}
Packet::Packet() {
}
Packet::Packet(char &s) {
	bytes = new queue<byte>;
	int len = strlen(&s);
	cout << &s << endl;
	int _bytes = floor((float)len/2)-floor((float)len/6);
	for(int i=1; i<=_bytes; ++i) {
		bytes->push(substr(&s, (i-1)*3, 1));
	}
}
void Packet::Next() {
	++index;
}
template<typename T>void Packet::read(T &buf) {
	cout << "size of argument: " << sizeof(T) << endl;
}
Packet& Packet::operator+(long l) {
	return *this;
}
Packet& Packet::operator+(int i) {
	return *this;
}
Packet& Packet::operator+(char *s) {
	for(int i = 0; i < strlen(s); ++i) {
		bytes->push(s[i]);
	}
	return *this;
}
Packet& Packet::operator+(byte b) {
	bytes->push(b);
	return *this;
}
int substr(char *s, int start, int length) {
	char t[2] = {s[start], s[(start+length)]};
	return (int)strtol(t, NULL, 16);
}
J'aimerais pouvoir faire par exemple:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
	char *p = "01 02 05 6b 6b 6b 6b 6b ff aa";
	Packet *pk = new Packet(*p);
	int h, a, l;
	long v;
	char *str;
	pk->read(h); // h = 01 - readint
	pk->read(a); // a = 02 - readint
	pk->read(str); // str = 6b 6b 6b 6b 6b  (en prenant en compte de lire le 05 = length du str)
	pk->read(v); // v = aa ff
Voila,
le deuxième problème est au niveau de la surcharge d'operateurs

J'ai un thread
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
DWORD WINAPI ls_Listen(LPVOID para) {
	XServer::LoginServer *ls = (XServer::LoginServer *) para;
//[.......]
Plus bas, j'accepte un socket et
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
							Client *c = new Client((std::string)inet_ntoa(csin.sin_addr), (int)ntohs(csin.sin_port), csock);
							ls += c;
Donc je creer mon object client, en donnant toutes les valeurs (tout va bien)
VC2010 me dit que 'c' doit avoir un type integral ou enum ?!

La déclaration de LoginServer operator+:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
XServer::LoginServer& XServer::LoginServer::operator+(Client &c) {
	Clients += c;
	return *this;
}

La déclaration de Clients operator+:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
Sessions& Sessions::operator+(Client &c) {
	clients[c.Get()->_aid] = &c;
	return *this;
}
Comment faire pour corriger cette erreur?

Merci d'avance, nico