【问题标题】:Using template parameter within a second template (STL container)在第二个模板(STL 容器)中使用模板参数
【发布时间】:2009-06-01 00:12:58
【问题描述】:

我是一个尝试模板和设计模式的菜鸟,我想使用模板参数 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 类型。请原谅我使用了不正确的术语,例如“模板参数”和“模板参数”。

【问题讨论】:

    标签: c++ design-patterns templates


    【解决方案1】:

    这是 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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-03
      • 2013-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-24
      • 1970-01-01
      相关资源
      最近更新 更多