2016-10-06 13 views
0

私は単純なリンクリストを作成していますが、すべてうまくいきますが、クラス外のメソッドを定義する際には理解できない問題があります。私は、クラス内のメソッドを定義する場合、私はメソッドを宣言し、私はコンパイルエラーを取得し、クラスの外でそれを定義しようとしたときには、完璧に動作...テンプレートクラス以外のメソッドの定義

だからここにそれが正常に動作コードです:

は、
#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

+1

あなたは、コードを編集することができます。ピクチャではなく、インラインコードとエラーメッセージを持つことをお勧めします。 – Hayt

+0

新しいユーザーはなぜ新しい質問をする前に調査をしませんか?一口。 –

+0

@πάνταῥεῖ申し訳ありませんが、私は適切なトピックを見つけようとしましたが、私の質問に特定の回答が見つかりませんでした... –

答えて

1

Iteratorとは何ですか? IteratorLinkedList<T>従属スコープの内部クラスであることをコンパイラに伝える必要があります。それがエラーメッセージと一緒に働いていないものを示して

wandbox example

template <typename T> 
struct LinkedList 
{ 
    class Iterator 
    {  
    }; 

    Iterator insert(Iterator, const T&); 
}; 

template <typename T> 
typename LinkedList<T>::Iterator LinkedList<T>::insert(Iterator, const T&) 
{ 
    // ... 
} 
+0

これはコンパイルされます! typenameについてもっと教えてください。 –

+0

[こちら](http://stackoverflow.com/questions/7923369/when-is-the-typename-keyword-necessary) –

+0

ありがとう! Iterator:++でインクリメントされ、*で参照され、!=で別のイテレータと比較されるポインタのようなオブジェクト。 –

関連する問題