2009-06-01 88 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