Bonjour,

Environnement :
OS : Mac OS X 10.6.4
IDE : Xcode 3.2
Compilateur : GCC 4.2

Je suis en train de me remettre au C++ après avoir eu un très léger apprentissage l'année dernière. Pour cela, je m'entraîne en implémentant les structures de données usuelles. J'ai donc commencé par la pile.

Pour cela j'utilise donc une classe générique (template de classe) :

Stack.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
 
#ifndef STACK_H_
#define STACK_H_
 
#include <iostream>
 
template<typename T>
class Stack {
public: 
    Stack();
    virtual ~Stack();
 
    void push(const T);
    T pop();
    bool isEmpty() const;
    int size() const;
 
private:
    T* _data;
    int _size;
    static void _arrayCopy(T*, T*, int);
};
 
#endif /* STACK_H_ */
Stack.cpp
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
 
#include "Stack.h"
 
using namespace std;
 
template<typename T>
Stack<T>::Stack() : _size(0) {
    _data = new T[0];
}
 
template<typename T>
Stack<T>::~Stack() {
    delete _data;
}
 
template<typename T>
void Stack<T>::push(const T element) {
    T* oldData = _data;
 
    _data = new T[++_size];
    Stack::_arrayCopy(oldData, _data, _size);
    delete oldData;
}
 
template<typename T>
T Stack<T>::pop() {
 
    T element = _data[_size - 1];
 
    T* oldData = _data;
 
    _data = new T[--_size];
    Stack::_arrayCopy(oldData, _data, _size);
    delete oldData;
 
    return element;
}
 
template<typename T>
bool Stack<T>::isEmpty() const {
    return _size == 0;
}
 
template<typename T>
int Stack<T>::size() const {
    return _size;
}
 
template<typename T>
void Stack<T>::_arrayCopy(T* source, T* destination, int copyCount) {
    for (int current = 0; current < copyCount; current++) {
        destination[current] = source[current];
    }
 
}
Afin de tester ma classe j'ai tout simplement commencé par l'instancier et j'appelle ensuite une méthode :

main.cpp
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
 
#include <iostream>
#include "Stack.h"
 
 
using namespace std;
 
int main () {
 
    Stack<int> pile();
    pile.isEmpty();
 
 
    return 0;
}
Mon problème est que mon compilateur ne semble pas reconnaître pile comme étant un objet de ma classe Stack<T> (en l'occurence, un objet de la classe Stack<int>).

Voici l'erreur retournée :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5

/***/***/Workspace/containers/main.cpp:10:0
/***/***/Workspace/containers/main.cpp:10:
error: request for member 'isEmpty' in 'pile', which is of non-class type 'Stack<int> ()()'
Ce qui me trouble dans ce message d'erreur, c'est que le compilateur mentionne une classe Stack<int> ()() (notez les deux paires de parenthèses).

Étant donné que je manipule les classes génériques pour la première fois en C++, il est possible que mon erreur soit assez simple.