2009-06-01 5 views
2

私はテンプレートとデザインパターンを試してみて、テンプレート引数ITEMを使用してイテレータパターンを作成したいと思います。しかし、私のプライベートメンバーvarはそれ自身がテンプレートであるSTLコンテナなので、STLコンテナのテンプレート引数をクラステンプレートで使用されるものとどのように同期させることができますか?2番目のテンプレート(STLコンテナ)内でのテンプレートパラメータの使用

#include "StatusIteratorInterface.h" 
#include "StatusContainer.h" 
#include <map> 

template<typename ITEM> class StatusContainer; 

template <typename ITEM> 
class StatusIterator : public StatusIteratorInterface<ITEM> { 

public: 
    StatusIterator(StatusContainer<ITEM>* container); 

    ITEM* getFirst(void); 
    ITEM* getNext(void); 
    bool isDone(void); 
    ITEM* getCurrent(void); 

private: 
    StatusContainer<ITEM>* container_; 
    ITEM* currentItem_; 
    std::multimap< std::pair<std::string, uint32_t>, ITEM >::iterator conIter1_; //gives error 
    std::multimap< std::pair<string, uint32_t>, uint32_t>::iterator conIter_; 
}; 

conIter_は大丈夫ですが、 'ハード・コード' 私のテンプレート値:

は、ここで実際のクラスです。その上の行を含め、このコンパイルエラーを与える:

/Users/joe/Developer/Template_DesignPattern_Iterator/StatusIterator.h:33: error: expected ';' before 'conIter1_' 

私がコンパイルされ、実行されます。このコードの罰金を、しかし、明らかにのuint32_tタイプにのみ適しているメインを持っています。私が「テンプレート引数」や「テンプレートパラメータ」などの間違った用語を使用してしまった場合はどうか教えてください。

答えて

12

これはC++の一般的な障害です。そのクラスが解析されるときにはITEMが不明なので、コンパイラはイテレータが実際に型であると推論することはできません。

変更この行:

typename std::multimap< std::pair<std::string, uint32_t>, ITEM >::iterator conIter1_; 

あなたは、その名前でテンプレートパラメータを持つ型を使用している:

std::multimap< std::pair<std::string, uint32_t>, ITEM >::iterator conIter1_; 

それがタイプだということを示すために、typenameを開始します。

これは、使用する必要があるときです。typenameです。

関連する問題