Шаблоны -> Как расшифровать, решить при необходимости и создать? - PullRequest
0 голосов
/ 14 апреля 2010

У меня есть несколько классов в проекте, которые я унаследовал, которые действительно старые, в последний раз я знал, что они скомпилированы с CodeWarrior 8. Сейчас я нахожусь в XCode 3.2

Вот пример того, с чем я борюсь:

template <class registeredObject> 
typename std::vector<registeredObject>::iterator FxRegistry<registeredObject>::begin(void)
{
    return mRegistryList.begin();
}

Ошибки:

no 'typename std::vector<registeredObject, std::allocator<_CharT> >::iterator FxRegistry<registeredObject>::begin()' member function declared in class 'FxRegistry<registeredObject>'

template definition of non-template 'typename std::vector<registeredObject, std::allocator<_CharT> >::iterator FxRegistry<registeredObject>::begin()'

Как мне решить, как их решить и с чего начать искать?

ОБНОВЛЕНИЕ: Вот класс FxRegistry:

template <class registeredObject>
class FxRegistry
{
public:
    // Construction
    FxRegistry() {}
    ~FxRegistry();

    // List management
    void Register(const registeredObject &ob);
    void Unregister(registeredObject &ob);

    // List iteration
    typedef std::vector<registeredObject>::iterator iterator;
    typedef std::vector<registeredObject>::const_iterator const_iterator;
    std::vector<registeredObject>::iterator begin(void);
    std::vector<registeredObject>::const_iterator begin(void) const;
    std::vector<registeredObject>::iterator end(void);
        std::vector<registeredObject>::const_iterator end(void) const;

    FxSize size(void);
    void Insert(iterator iter,const registeredObject &ob);
    registeredObject &operator[](FxInt32 index) { return mRegistryList[index]; }
        void clear() {mRegistryList.clear();};
protected:
    vector<registeredObject> mRegistryList;
};

Я получаю сообщения об ошибках в каждой строке выше: ошибка: тип 'std :: vector>' не является производным от типа 'FxRegistry' ошибка: ожидается ';' перед «итератором»

Я думал, что итератор имеет векторный тип, поэтому я бы объявил один векторный итератор.

Ответы [ 2 ]

2 голосов
/ 14 апреля 2010
typedef std::vector<registeredObject>::iterator iterator;
typedef std::vector<registeredObject>::const_iterator const_iterator;
std::vector<registeredObject>::iterator begin(void);
std::vector<registeredObject>::const_iterator begin(void) const;
std::vector<registeredObject>::iterator end(void);
    std::vector<registeredObject>::const_iterator end(void) const;

Во всех этих местах вы должны использовать:

typename std::vector<registeredObject>::iterator

iterator и const_iterator являются зависимыми именами (их значение зависит от того, что может содержать конкретная реализация vector<X>), а язык требует, чтобы вы указали, является ли это имя типа или нет, поэтому компилятор может знать, не создавая экземпляр vector<X>.

Также может иметь смысл использовать определяемые вами typedef.

От того, с чего начать - первая ошибка в списке. :)

0 голосов
/ 14 апреля 2010

Проверьте следующее:

  • Есть ли #include <vector> перед включением этого заголовка?
  • В части protected объявления класса vector не квалифицируется как std::.
  • Добавьте typename перед каждым из std::vector<registeredObject>::iterator и ... const_iterator использует
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...