错误:在'<'标记之前的预期构造函数,析构函数或类型转换

时间:2011-06-25 08:42:13

标签: c++ templates

我对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 个答案:

答案 0 :(得分:3)

我在Visual Studio 2010中按原样复制粘贴代码并编译和链接没有任何问题,所以标题和cpp的内容都在一个地方(即粘贴在main.cpp中)。同样,GCC doesn't complain either

在标题和cpp中拆分之后,它仍然编译得很好,但是现在有链接器错误,我们在评论中给出的链接中解释了它们的原因(this和{{ 3}},this)。从语法上讲,就我和我的编译器而言,你的代码没有任何问题。

我唯一可以想象的是,看到你第一次链接到pastebin,你在那里粘贴完整的文件(我在问题中编辑过),就是你从未在Stack.h中加入Stack.cpp (我认为这可能是原因,因为你的Stack.h粘贴甚至包含了防护装置。但问题仍然存在。