【发布时间】:2011-06-25 08:42:12
【问题描述】:
我对 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;
};
堆栈.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;
}
这里出了什么问题?
【问题讨论】:
-
int = 10,我可以告诉你这是个问题。在stack.h中
-
我还建议阅读有关构造函数和更具体的初始化列表的内容!它们的使用非常重要,例如参见C++ FAQ Lite。此外,当一个方法只返回两个值(成功/失败)时,返回布尔值而不是整数值会更惯用且不易混淆。
-
@Laika:您立即编译错误的答案是您需要在
Stack.cpp的顶部使用#include "Stack.h",但问题仍然是members 的定义Stack模板的一部分需要在main中实例化Stack<int>的位置可见。 -
@Laika:是的,请参阅我提供的链接以获得解释。只要您计划在多个翻译单元中使用该模板,它们就必须是仅标题。