2009-06-01 63 views
2

我是一個noob嘗試模板和設計模式,並且想使用模板參數ITEM創建一個迭代器模式。但是,我的私有成員var是一個STL容器,它本身就是一個模板,所以如何將STL容器的模板參數「同步」到類模板使用的模板參數?在第二個模板(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的類型。如果我使用了錯誤的術語,比如'template argument'vice'template parameter',請原諒我。

回答

12

這是C++中常見的絆腳石。由於ITEM在分析該類時未知,因此編譯器無法推斷出您的迭代器確實是一種類型。

改變這一行:

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

開始與typename,表明它是一個類型:

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

您正在使用其名稱中有一個模板參數類型。

這就是當你需要使用typename