失踪';'之前'<'

问题描述:

我正在做一些练习,并试图将简单的类转换为模板类。 更改代码后,我收到了一堆链接程序错误,因此我从实现中删除了头文件包含语句,现在将实现文件包含在头文件的底部。自那时起,我得到这个奇怪的语法错误:缺少';' '<'之前。我看不到我做错了什么。失踪';'之前'<'

这是我的头文件:

#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; 
} 

任何帮助,将不胜感激!

+6

也许看着它给你的行号可能会有所帮助... – Mysticial 2012-04-04 16:03:35

+0

你是如何编译它的? – juanchopanza 2012-04-04 16:04:47

+0

我不是很擅长编写模板,但是您不需要在类本身内部实现模板类的成员函数的主体吗?我的意思是说,每个文件都需要知道如何重新生成类。 – Shahbaz 2012-04-04 16:06:19

我的猜测是你正试图编译.cpp文件。尽管文件扩展名易混淆,但它不是一个完整的翻译单元,因此它不能自行编译。只要包含来自任何使用该类的文件的标题即可。

就我个人而言,我会将实现移到头文件中;其他人可能会给它一个不同的文件扩展名,看起来不像一个可编译的源文件(我已经看过.tcc.inl用于这样的文件,但没有通用约定)。

另外:

template<class T> 
typename T Stack<T>::top() const 
^^^^^^^^^ 

卸下typename;您只能在取决于模板参数的类型名称之前放置该名称。

+0

好的,谢谢。感谢所有回应 – user1290709 2012-04-04 16:18:33