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

どんな助けもいただければ幸いです!!!

4

1 に答える 1

3

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

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

また:

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

それを削除しtypenameます; テンプレートパラメータに依存する型名の前にのみそれを置きます。

于 2012-04-04T16:11:29.973 に答える