Bonjour
J'essaye de comprendre le fonctionnement des spécialisations de classes template.
Plus précisément, je ne comprends pas pourquoi le code suivant ne compile pas, et renvoie des erreurs. Par exemple, le compilateur renvoie l'erreur "Error; this declaration has no storage class or type specifier" pour le mot clé cout dans la boucle if.
Alors que si je ne spécialise pas la classe, le code suivant fonctionne parfaitement:
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 template <class T> class Bag<T*> { private: T* elem; int size; int max_size; public: Bag() : elem(0), size(0), max_size(1) {} void add(T* t) { T* tmp; if (t == NULL) { // Check for NULL cout<<"Null pointer!"<<endl; // return; } if (size + 1 >= max_size) { max_size *= 2; tmp = new T [max_size]; for (int i = 0; i < size; i++) tmp[i] = elem[i]; tmp[size++] = *t; // Dereference delete [] elem; elem = tmp; } else elem[size++] = *t; // Dereference } void Pprint() { for (int i = 0; i <size; i++) cout << elem[i] << " "; cout << endl; } };
Pourtant, ce code ne vient pas de moi, mais de la MSDN:
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 template <class T> class Bag{ private: T* elem; int size; int max_size; public: Bag() : elem(0), size(0), max_size(1) {} void add(T* t) { T* tmp; if (t == NULL) { // Check for NULL cout<<"Null pointer!"<<endl; // return; } if (size + 1 >= max_size) { max_size *= 2; tmp = new T [max_size]; for (int i = 0; i < size; i++) tmp[i] = elem[i]; tmp[size++] = *t; // Dereference delete [] elem; elem = tmp; } else elem[size++] = *t; // Dereference } void Pprint() { for (int i = 0; i <size; i++) cout << elem[i] << " "; cout << endl; } };
http://msdn.microsoft.com/en-us/library/3967w96f.aspx
Que se passe-t-il avec la spécialisation?
Je vous remercie
Partager