2009-06-01 2 views
2

Я экспериментирую с шаблонами и шаблонами проектирования и хотел бы создать шаблон итератора с использованием аргумента шаблона 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. Простите меня, если я использовал неправильную терминологию, такую ​​как параметр шаблона «параметр шаблона».

ответ

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.

Смежные вопросы