ошибка: ожидаемый конструктор, деструктор или преобразование типа перед маркером ‘<’ - PullRequest
5 голосов
/ 25 июня 2011

Я довольно новичок в C ++, но уже приобрел некоторый опыт работы с Java.

В следующем коротком упражнении c ++ я попытался построить стек, используя шаблон класса.К сожалению, его не удается скомпилировать, и я не могу понять, почему.

Сообщение об ошибке:

Stack.cpp: 6: ошибка: ожидаемый конструктор, деструктор или преобразование типадо ‘<’ токен
Stack.cpp: 14: ошибка: ожидаемый инициализатор до ‘<’ токен
Stack.cpp: 25: ошибка: ожидаемый инициализатор до ‘<’ токен
make [2]: * [build / Debug / GNU-Linux-x86 / Stack.o] Ошибка 1

Вот Stack.h:

template <class T>
class Stack {
public:
    Stack(int = 10);

    ~Stack() {
        delete [] stackPtr;
    }

    int isEmpty()const {
        return top == -1;
    }

    int isFull() const {
        return top == size - 1;
    }

    int push(const T&);
    int pop(T&);

private:
    int size; // length i.e. number of elements on Stack.
    int top; //index of top element
    T* stackPtr;
};

Stack.cpp:

template <class T>
Stack<T>::Stack(int s) {
    size = s > 0 && s < 1000 ? s : 15;
    top = -1; // initialize stack
    stackPtr = new T[size];
}

template <class T>
int Stack<T>::push(const T& item) {
    if (!isFull()) {
        stackPtr[++top] = item;
        return 1; // push successful
    }
    return 0; // push unsuccessful
}

template <class T>
int Stack<T>::pop(T& popValue) {
    if (!isEmpty()) {
        popValue = stackPtr[top--];
        return 1; // pop successful
    }
    return 0; // pop unsuccessful
}

Файл main.cpp выглядит так:

#include <iostream>
#include "Stack.h"
using namespace std;

int main(int argc, char** argv) {
    Stack<int> intStack;
    int i = 1.1;
    cout << "Pushing:" << endl;
    while (intStack.push(i)) {
        cout << i << ' ';
        i += 1;
    }
    cout << endl << "Stack Full" << endl
         << endl << "Popping elements from is" << endl;
    while (intStack.pop(i))
        cout << i << ' ';
    cout << endl << "Stack Empty" << endl;
}

Что здесь не так?

1 Ответ

3 голосов
/ 25 июня 2011

Я скопировал и вставил ваш код как есть в Visual Studio 2010, скомпилировал и связал без каких-либо проблем, поэтому контент из header и cpp находится в одном месте (то есть вставляется как в main.cpp). Кроме того, GCC не жалуется либо .

После разбиения его на заголовок и cpp, он все равно прекрасно компилировался, но теперь были ошибки компоновщика, причина которых объяснялась в ссылках, которые я дал в своем комментарии ( this и this , ссылки C ++ FAQ также могут быть интересны ). Синтаксически, в вашем коде нет ничего плохого, насколько я и мой компилятор можем видеть.

Единственное, что я мог себе представить, увидев, что вы сначала связались с pastebin, где вы возглавляете полные вставленные файлы (которые я тогда редактировал в вопросе), это то, что вы никогда не включали Stack.h в Stack.cpp (я думаю, что это возможно, причина в том, что у вашей Stack.h пасты были даже защитники включения). Тем не менее, фундаментальная проблема остается.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...