Использование параметра шаблона во втором шаблоне (контейнер STL) - PullRequest
2 голосов
/ 01 июня 2009

Я новичок, экспериментирующий с шаблонами и шаблонами проектирования, и хотел бы создать шаблон итератора, используя аргумент шаблона 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 Ответ

12 голосов
/ 01 июня 2009

Это распространенный камень преткновения в 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...