шаблон стека не компилирует push-функцию - PullRequest
2 голосов
/ 18 ноября 2010

Я написал такую ​​структуру данных, похожую на стек:

template<class T>
class Stos {
    class Element {
        public:
        T n;
        Element* prev;
        Element(const T& k = 0): n(k), prev(0) {}
    };
    Element* member;
    Stos(Stos&);
    public:
    Stos(const T&);
    ~Stos();
    unsigned int count;
    T get();
    Element* push(const T&);
    T pop();
    void mod(const T&);
};

И реализацию (тот же файл):

template<class T>
Stos<T>::Stos(const T& n = 0): count(1) {
    member = new Element(n);
}

template<class T>
T Stos<T>::get() {
    return member->n;
}

template<class T>
Stos<T>::Element* Stos<T>::push(const T& n = 0) {
    Element* point = member;
    member = new Element;
    member->prev = point;
    if(n != 0) member->n = n;
    ++count;
    return member;
}

template<class T>
T Stos<T>::pop() {
    Element* point = member;
    T n = point->n;
    member = point->prev;
    --count;
    delete point;
    return n;
}

template<class T>
void Stos<T>::mod(const T& n) {
    member->n = n;
}

template<class T>
Stos<T>::~Stos() {
    while(member) pop();
}

И когда я пытаюсь скомпилировать ее с помощью g ++, яполучить эту ошибку о первой строке определения Stos::Element* Stos::push(): expected constructor, destructor, or type conversion before ‘*’ token.Это моя первая попытка написать что-то с помощью шаблонов.Этот код стека работал без шаблонов, когда я его редактировал, потом получал ошибку, раньше все работало просто отлично, везде было «int» вместо «T».

И я не могу узнатьпочему это не компилируется.Не могу ли я использовать указатель на class :: member?

Ответы [ 2 ]

5 голосов
/ 18 ноября 2010

Вам необходимо добавить префикс имени Element к typename

typename Stos<T>::Element* Stos<T>::push(const T& n = 0) 

Вот ссылка на полное объяснение, почему это необходимо

2 голосов
/ 19 ноября 2010

Вам также следует рассмотреть возможность использования

const T &n = T()

вместо

const T &n = 0

Поскольку не все возможные T могут быть инициализированы с 0!

...