我是C++的新手,但已经在java中获得了一些经验.
在下面的简短c ++练习中,我尝试使用类模板构建堆栈.不幸的是它无法编译,我无法弄清楚原因.
错误消息是:
Stack.cpp:6:错误:预期构造,析构函数,或类型之前转换
‘<’
令牌
Stack.cpp:14:错误:前预期初始‘<’
令牌
Stack.cpp:25:错误:预期初始化之前‘<’
令牌
使[2]:* [构建/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;
};
Run Code Online (Sandbox Code Playgroud)
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
}
Run Code Online (Sandbox Code Playgroud)
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;
}
Run Code Online (Sandbox Code Playgroud)
这里出了什么问题?
我将您的代码按原样复制粘贴到 Visual Studio 2010 中,并编译和链接,没有任何问题,只要 header 和 cpp 中的内容都位于一处(即,将两者粘贴到 main.cpp 中)。同样,GCC 也没有抱怨。
将其拆分为标头和 cpp 后,它仍然编译得很好,但现在出现了链接器错误,它们的原因在我在评论中给出的链接中进行了解释(this和this,这个 C++ FAQ 链接也可能是有趣的)。从语法上来说,就我和我的编译器而言,你的代码没有任何问题。
我唯一能想象到的,看到你首先链接到pastebin,你在其中粘贴了完整的文件(我当时在问题中编辑过),是你从未包含在Stack.h
其中Stack.cpp
(我认为这可能是原因,因为你的Stack.h
粘贴甚至有包括警卫)。尽管如此,根本问题仍然存在。