在第二个模板(STL容器)中使用模板参数

时间:2009-06-01 00:12:58

标签: c++ design-patterns templates

我是一个尝试使用模板和设计模式的菜鸟,并希望使用模板参数ITEM创建迭代器模式。但是,我的私有成员var是一个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_'

我有一个main编译并运行此代码很好,但显然只适用于uint32_t类型。请原谅我,如果我使用了不正确的术语,例如'模板参数'副'模板参数'。

1 个答案:

答案 0 :(得分: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