2012-04-04 65 views
-1

我正在做一些練習,並試圖將簡單的類轉換爲模板類。 更改代碼後,我收到了一堆鏈接程序錯誤,因此我從實現中刪除了頭文件包含語句,現在將實現文件包含在頭文件的底部。自那時起,我得到這個奇怪的語法錯誤:缺少';' '<'之前。我看不到我做錯了什麼。失蹤';'之前'<'

這是我的頭文件:

#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

回答

3

我的猜測是你正試圖編譯.cpp文件。儘管文件擴展名易混淆,但它不是一個完整的翻譯單元,因此它不能自行編譯。只要包含來自任何使用該類的文件的標題即可。

就我個人而言,我會將實現移到頭文件中;其他人可能會給它一個不同的文件擴展名,看起來不像一個可編譯的源文件(我已經看過.tcc.inl用於這樣的文件,但沒有通用約定)。

另外:

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

卸下typename;您只能在取決於模板參數的類型名稱之前放置該名稱。

+0

好的,謝謝。感謝所有迴應 – user1290709 2012-04-04 16:18:33