use*_*740 2 c++ templates design-patterns
我是一个尝试模板和设计模式的菜鸟,想要使用模板参数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_;
};
Run Code Online (Sandbox Code Playgroud)
conIter_很好,但'硬编码'我的模板值.包括上面的行给出了这个编译错误:
/Users/joe/Developer/Template_DesignPattern_Iterator/StatusIterator.h:33: error: expected ';' before 'conIter1_'
Run Code Online (Sandbox Code Playgroud)
我有一个main编译并运行此代码很好,但显然只适用于uint32_t类型.请原谅我,如果我使用了不正确的术语,例如'模板参数'副'模板参数'.
Dre*_*ann 12
这是C++中常见的绊脚石.因为ITEM在解析该类时未知,编译器无法推断出您的迭代器确实是一个类型.
改变这一行:
std::multimap< std::pair<std::string, uint32_t>, ITEM >::iterator conIter1_;
Run Code Online (Sandbox Code Playgroud)
首先typename,要表明它是一种类型:
typename std::multimap< std::pair<std::string, uint32_t>, ITEM >::iterator conIter1_;
Run Code Online (Sandbox Code Playgroud)
您正在使用名称中包含模板参数的类型.
那是你需要使用的时候typename.