Question de base sur un template
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.
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
|
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;
}
}; |
Alors que si je ne spécialise pas la classe, le code suivant fonctionne parfaitement:
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
|
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;
}
}; |
Pourtant, ce code ne vient pas de moi, mais de la MSDN:
http://msdn.microsoft.com/en-us/library/3967w96f.aspx
Que se passe-t-il avec la spécialisation?
Je vous remercie