失踪';'之前'<'
问题描述:
我正在做一些练习,并试图将简单的类转换为模板类。 更改代码后,我收到了一堆链接程序错误,因此我从实现中删除了头文件包含语句,现在将实现文件包含在头文件的底部。自那时起,我得到这个奇怪的语法错误:缺少';' '<'之前。我看不到我做错了什么。失踪';'之前'<'
这是我的头文件:
#ifndef STACK_H
#define STACK_H
#include <iostream>
template<class T>
class Stack
{
T* buffer;
size_t count;
public:
Stack();
~Stack();
void push(T value);
void pop();
T top() const;
size_t size() const;
};
#include "Stack.cpp"
#endif
而这正是实现文件:
template<class T>
Stack<T>::Stack() : count(0)
{
buffer = new T;
}
template<class T>
Stack<T>::~Stack()
{
delete[] buffer;
}
template<class T>
void Stack<T>::push(T value)
{
if(size() == 0) *(buffer) = value;
else
{
T* newBuffer = new T[count+1];
for(size_t i=0; i <= size(); ++i)
newBuffer[i] = buffer[i];
newBuffer[count] = value;
buffer = newBuffer;
}
++count;
}
template<class T>
void Stack<T>::pop()
{
if(size() <= 0) return;
buffer[size()-1]=0;
--count;
}
template<class T>
typename T Stack<T>::top() const
{
if(size() <= 0)
{
std::cout << "the stack is empty" << std::endl;
return -1;
}
else
{
return buffer[size()-1];
}
}
template<class T>
size_t Stack<T>::size() const
{
return count;
}
任何帮助,将不胜感激!
答
我的猜测是你正试图编译.cpp
文件。尽管文件扩展名易混淆,但它不是一个完整的翻译单元,因此它不能自行编译。只要包含来自任何使用该类的文件的标题即可。
就我个人而言,我会将实现移到头文件中;其他人可能会给它一个不同的文件扩展名,看起来不像一个可编译的源文件(我已经看过.tcc
和.inl
用于这样的文件,但没有通用约定)。
另外:
template<class T>
typename T Stack<T>::top() const
^^^^^^^^^
卸下typename
;您只能在取决于模板参数的类型名称之前放置该名称。
+0
好的,谢谢。感谢所有回应 – user1290709 2012-04-04 16:18:33
也许看着它给你的行号可能会有所帮助... – Mysticial 2012-04-04 16:03:35
你是如何编译它的? – juanchopanza 2012-04-04 16:04:47
我不是很擅长编写模板,但是您不需要在类本身内部实现模板类的成员函数的主体吗?我的意思是说,每个文件都需要知道如何重新生成类。 – Shahbaz 2012-04-04 16:06:19