私は単純なリンクリストを作成していますが、すべてうまくいきますが、クラス外のメソッドを定義する際には理解できない問題があります。私は、クラス内のメソッドを定義する場合、私はメソッドを宣言し、私はコンパイルエラーを取得し、クラスの外でそれを定義しようとしたときには、完璧に動作...テンプレートクラス以外のメソッドの定義
だからここにそれが正常に動作コードです:
は、#ifndef LINKEDLIST__H_
#define LINKEDLIST__H_
#pragma warning (disable: 4290)
#include "Item.h"
template<class T> class LinkedList
{
Item<T>* head;
Item<T>* tail;
public:
LinkedList(): head(new Item<T>()), tail(new Item<T>())
{
head->setNext(tail);
tail->setPrev(head);
}
~LinkedList() { delete head; } // how does that work?
class Iterator // Nested class.
{
Item<T>* p;
friend class LinkedList<T>;
public:
Iterator(Item<T>* pt = 0) : p(pt) {}
int operator!=(Iterator itr) const // Operator !=
{
return (p != itr.p);
}
Iterator& operator++(int) throw(char*) // Operator ++ (postfix)
{
if (p == NULL)
throw "null pointer in list::iterator";
p = p->getNext();
return *this;
}
Iterator& operator--(int) throw (char*) // Operator -- (postfix)
{
if (p == NULL)
throw "null pointer in list::iterator";
p = p->getPrev();
return *this;
}
T& operator*() throw (char*) // Operator *
{
if (p == NULL || p->getData() == NULL)
throw "null pointer in list::iterator";
return *(p->getData());
}
}; // End of class Iterator scope.
Iterator begin() { return head->getNext(); }
Iterator end() { return tail; }
Iterator insert(Iterator itr, const T& data)
{
// create a copy of data
Item<T>* pNewItem = new Item<T>(new T(data));
// connect
pNewItem->setNext(itr.p);
pNewItem->setPrev(itr.p->getPrev());
itr.p->getPrev()->setNext(pNewItem);
itr.p->setPrev(pNewItem);
return pNewItem;
}
Iterator erase(Iterator itr);
}; // End of class LinkedList scope.
#endif // !LINKEDLIST__H_
クラス外で挿入メソッドを実装しようとすると:(VS2015でこれを自動的に行う方法ですが、静的バインディングのためにヘッダーファイル内で定義されています) このコードは機能しませんコンパイルエラーが発生します。
クラス外のメソッドを定義する:(コンパイルエラー) enter image description here
あなたは、コードを編集することができます。ピクチャではなく、インラインコードとエラーメッセージを持つことをお勧めします。 – Hayt
新しいユーザーはなぜ新しい質問をする前に調査をしませんか?一口。 –
@πάνταῥεῖ申し訳ありませんが、私は適切なトピックを見つけようとしましたが、私の質問に特定の回答が見つかりませんでした... –