2017-11-09 13 views
0

私はクラスが固定サイズのリンクされたリストであり、そのクラスの中にListの特定の要素を指す別のクラスListIteratorがあります。私の問題はc++の構文です。よく慣れていないので、gccのビルドエラーは私を助けてくれません。C++ネストされたテンプレートクラスの構文

template<class T, int length> 
class List { 
public: 
    //some stuff here 
    //Row-struct 

    template<class T> 
    class ListIterator { 
     public: 
      ListIterator(int mPos, Row& mRow){pos = mPos; row = mRow;}; 
      T& operator *(); 
     private: 
      int pos; 
      Row& row; 
    }; 

    typedef ListIterator<T> iterator; 

    iterator begin(); 
private: 
    int startIdx; 
    Row storage[length]; 
}; 

template<class T, int length> 
ListIterator List<T, length>::begin() { 
    ListIterator *itor = new ListIterator(startIdx, storage[startIdx]); 
    return itor; 
} 

私は、次のエラーを取得:

error: shadows template parm 'class T'

  1. は、どのように私はこのtypedef ListIterator<T>作業を行うことができますか?
  2. どうすれば同じものを使うことができますかTイテレータのためにListに使用しましたか?
  3. begin()はなぜ機能しませんか?
+1

を、あなたはそれがこの範囲で知られています、それを使用して、何もする必要はありません。 – Sopel

+0

しかし 'ListIterator'では' ListIterator'で 'typedef – binaryBigInt

+0

' 'ListIterator'クラス' Listclass List'内の 'List'を' T'にアクセスしたいので 'ListIterator'でも' template'である必要はありません。あなたは直接 'class iterator'と名前をつけてtypedefをスキップすることもできます – Caleth

答えて

1

ListIteratorテンプレートパラメータTの名前を、たとえばTInnerに変更します。または、外部クラスからTを使用できる場合は通常のクラスにします。 ListIteratorListクラスの外に移動すると、ListIteratorはリスト固有のものではないため、より良い考えになります。

あなたは適切な型を使用する必要がbegin機能修正するには:

template<typename T, int length> typename List<T, length>::iterator 
List<T, length>::begin(void) 
{ 
    iterator item_iterator(startIdx, storage[startIdx]); 
    return(item_iterator); 
} 
+0

' ListIterator'は 'List'(ポインタ、次の要素、前のエレメンなど)に関するいくつかのことを知っています – binaryBigInt

+0

@binaryBigIntあなたのコードは、 。 – VTT

+0

申し訳ありませんが、自分のコードを編集しました。 – binaryBigInt

関連する問題