8

キュー クラスを実装するために 2 つのスタックを使用しています。私のヘッダーファイルは次のようになります。

#ifndef _MyQueue_h
#define _MyQueue_h
using namespace std;

template <typename T>
class MyQueue {

public:
    MyQueue();
    ~MyQueue();
    void enqueue(T element);
    T peek();
    void dequeue();
    int size();
    bool empty();

private:
    int count;
    stack<T> stk1;
    stack<T> stk2;
};
# include "MyQueue.cpp"
# endif

そして、私の cpp (実装) ファイルは次のようになります。

#include <stack>
#include "MyQueue.h"
using namespace std;

template <typename T>
MyQueue<T>::MyQueue()
{
    count = 0;
}

template <typename T>
MyQueue<T>::~ MyQueue()
{
}

template <typename T>
void MyQueue<T>::enqueue(T element)
{
    stk1.push(element);
    count ++;
}

(その他の機能は省略)。

ただし、Xcode 4.5 を使用すると、私の関数 (MyQueue、~MyQueue、enqueue、peek など) が再定義されたと言い続けます。どこで再定義したかを明確にするのを手伝ってくれる人はいますか?

ありがとうございました

4

4 に答える 4

4

あなたは私が本当に嫌いなことをしようとしています。それはふりです。

を削除#include "MyQueue.cpp"し、MyQueue.cpp の内容に置き換えて、ファイル MyQueue.cpp を削除します。これですべてが機能します。

テンプレート コードをヘッダー ファイルと実装ファイルに分割できるふりをしようとしています。しかし、ヘッダー ファイルに実装ファイルをインクルードしてごまかす必要はありません。ごまかしたりふりをしたりせず、1 つのファイル (ヘッダー ファイル) だけにすべてを含めれば、混乱は少なくなります。

再定義を取得する正確な理由は、cpp ファイルを再度含むヘッダー ファイルを含む cpp ファイルをコンパイルしているためです。したがって、cpp ファイルの内容は 2 回コンパイルされます。

于 2013-11-13T22:07:18.930 に答える