2012-04-04 19 views
-1

私はいくつかのエクササイズを行い、単純なクラスをテンプレートクラスに変換しようとしました。 コードを変更した後、リンカのエラーが巻き込まれてしまいました。そのため、実装からヘッダーファイルインクルードステートメントを削除し、ヘッダーファイルの最後に実装ファイルを含めました。それ以来、この奇妙な構文エラーが発生します:missing ';' 「<」の前に私は何が間違っているのか分かりません。が見つかりません ';' before '<'

これは私のヘッダファイルです:

#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

+0

どのようにこれを編集していますか? – juanchopanza

+0

私はテンプレートの作成に堪能ではありませんが、クラス内のテンプレートクラスのメンバー関数の本体を実装する必要はありませんか?私は、各ファイルがどのようにクラスを再生成するのかを知っている必要があるという事実を考えています。 – Shahbaz

答えて

3

.cppファイルをコンパイルしようとしていると思います。混乱しているファイルの拡張子にもかかわらず、完全な翻訳単位ではないため、単独でコンパイルすることはできません。そのクラスを使用するファイルのヘッダをインクルードするだけです。

個人的には、実装をヘッダーファイルに移動します。他の人がコンパイル可能なソースファイル(私は.tcc.inlがこのようなファイルに使われているのを見てきましたが、一般的な規則はありません)のように見えない別のファイル拡張子を与えるかもしれません。また

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

はそのtypenameを削除します。テンプレートパラメータに依存する型名の前に置くだけです。

+0

さて、ありがとうございます。すべての回答ありがとう – user1290709

関連する問題