0

クラス プロジェクトのキューの配列を作成しようとしています。FIFO キューの仕様ファイルと実装ファイルを作成しました。しかし、私が書くとき:

QueType<movieType> fifoQueue[6];

次のエラー メッセージが表示されます。

エラー LNK2019: 未解決の外部シンボル "public: __thiscall QueType::QueType(void)" (??0?$QueType@VmovieType@@@@QAE@XZ) が関数 _main` で参照されています

キューの配列を作成できるようにするには、何を追加する必要がありますか。また、STL キューを使用できません。

メインファイルは次のとおりです。

#include "movieType.h" 
#include <iostream>
#include <fstream>
#include "QueType.h"

using namespace std;

int main()
{
movieType movie[9];
ifstream inFile("movie1.txt");

    //I get the error here
    QueType<movieType> fifoQueue[6];

    return 0;
}

仕様ファイルは次のとおりです。

//definition of NodeType
template <class ItemType>
struct NodeType
{
ItemType info; // store data
NodeType* next; // sotre location of data
};

//exception class used when queue is full
class FullQueue
{};

//Exception class used when queue is empty
class EmptyQueue
{};

//templated queue class
template<class ItemType>
class QueType
{
public:
    QueType();
    //Function: class constructor
    //Precondition: none
    //Postcondition: it initializes the pointers, front and rear to null

    ~QueType();
    //Function:class destructor
    //Precondition: queue has been initialized
    //Postcondition: deallocate allocated memory

    void MakeEmpty();
    //Function: determines whether the queue is empty
    //Precondition: queue has been initialized
    //Postcondition:queue is empty

    bool IsEmpty() const;
    //Function:determines whether the queue is empty
    //Precondition:queue has been initialized
    //Postcondition:Function value = (queue is empty)

    bool IsFull() const;
    //Function:determines whether the queue is full
    //Precondition:queue has been initialized
    //Postcondition:Function value = (queue is full)

    void Enqueue(ItemType newItem);
    //Function:Adds newItem to the rear of the queue
    //Precondition:queue has been initialized
    //Postcondition:if (queue is full), FullQueue exception is thrown,
    //else newItem is at rear of queue

    void Dequeue(ItemType& item);
    //Function:removes front item from the queue and returns it in item
    //Precondition:queue has been initialized
    //Postcondition:if (queue is empty), EmptyQueue exception is thrown
    //and item is undefines, else front element has been removed from
    //queue and item is a copy of removed element

private:
    NodeType<ItemType>* front; //pointer points to the front to the queue
    NodeType<ItemType>* rear; // pointer points to the rear of the queue
};

および仕様ファイル:

#include "QueType.h"//gives access to QueType class
#include <cstddef> //for NULL
#include <new> // for bad_alloc

template<class ItemType>
QueType<ItemType>::QueType()
{
front = NULL;
rear = NULL;
}

template <class ItemType>
QueType<ItemType>::~QueType()
{
MakeEmpty();
}

template <class ItemType>
void QueType<ItemType>::MakeEmpty()
{
NodeType<ItemType>* tempPtr;//temporary pointer

while(front != NULL)
{
    tempPtr=front;
    front = front->next;
    delete tempPtr;
}
rear = NULL;
}

template <class ItemType>
bool QueType<ItemType>::IsEmpty() const
{
return (front == NULL);
}

template <class ItemType>
bool QueType<ItemType>::IsFull() const
{
NodeType<ItemType>* location;
try
{
    location = new NodeType<ItemType>
    delete location;
    return false;
}
catch(std::bad_alloc exception)
{
    return true;
}
}

template <class ItemType>
void QueType<ItemType>::Enqueue(ItemType newItem)
{
if (IsFull())
        throw FullQueue();
else
{
    NodeType<ItemType>* newNode;
    newNode = new NodeType<ItemType>;
    newNode ->info=newItem;
    newNode->next=NULL;
    if(rear== NULL)
            front= newNode;
    else
            rear->next=newNode;
    rear=newNode;
}
}
4

1 に答える 1

1

「仕様ファイル」で宣言された関数を実装する必要があります。

QueTypeこの特定のエラー メッセージは、コンストラクターの実装が欠落していることを訴えているだけです(これがQueTypein で使用している唯一の関数であるためmain) が、他の関数を使用し始めるとすぐに、同様のリンカー エラーが発生します。

この場合、クラスはテンプレート化されているため、コンパイラが特殊化を作成するときにそれらにアクセスできるようにするために、定義をヘッダー ファイルに移動する必要があります。

詳細については、この質問を参照してください。

于 2012-08-27T02:47:47.957 に答える