Справка по шаблону C

#c #templates

#c #шаблоны

Вопрос:

Я думаю, что мои проблемы связаны с шаблоном, но я просто не знаю. Я получаю ошибки, такие как:

error: conversion from '__gnu_cxx::__normal_iterator<FxStreamable* (***)(), std::vector<FxStreamable* (**)(), std::allocator<FxStreamable* (**)()> > >' to non-scalar type '__gnu_cxx::__normal_iterator<std::pair<FxClassID, FxStreamable* (*)()>*, std::vector<std::pair<FxClassID, FxStreamable* (*)()>, std::allocator<std::pair<FxClassID, FxStreamable* (*)()> > > >' requested

и

no match for 'operator!=' in 'itera1 != ((FxPairRegistry<FxClassID, FxStreamable* (*)()>*)this)->FxPairRegistry<FxClassID, FxStreamable* (*)()>::mRegistryList. std::vector<_Tp, _Alloc>::end [with _Tp = FxStreamable* (**)(), _Alloc = std::allocator<FxStreamable* (**)()>]()'

в коде , который выглядит как

 for (iter itera1 = mRegistryList.begin(); itera1 != mRegistryList.end(); itera1  )
{
    if ((*itera1).first == id)
    {
        return (*itera1).second;
    }
}
  

Кто-нибудь может пролить свет на то, что происходит не так?

ОБНОВЛЕНИЕ: определен mRegistryList vector<registeredObject *> mRegistryList;

ОБНОВЛЕНИЕ: itera определяет typedef typename std::vector<pair<identifier,registeredObject> >::iterator iter;

ОБНОВЛЕНИЕ 3:

 template <class identifier,class registeredObject> registeredObject     FxPairRegistry<identifier,registeredObject>::GetEntry(identifier id, FxBool assertValue)
{
for (std::vector<registeredObject *>::iterator itera1 = mRegistryList.begin(); itera1 != mRegistryList.end(); itera1  )
{
    if ((*itera1).first == id)
    {
        return (*itera1).second;
    }
}

if (assertValue)
    ASSERT_MSG(0,"Entry not found in the registry");
return NULL;
}
  

Комментарии:

1. Что такое mRegistryList и как вы определили itera1?

2. Пожалуйста, отредактируйте и вставьте определение для mRegistryList .

3. Не могли бы вы добавить объявления mRegistryList и itera1?

Ответ №1:

Тип вашего итератора не соответствует типу итератора mRegistryList vector .

итератор: std::vector<std::pair<FxClassID, FxStreamable* (*)()> >::iterator

контейнер: std::vector<FxStreamable* (**)()>

РЕДАКТИРОВАТЬ: в ответ на обновление:

Используйте vector<registeredObject *>::iterator , а не другой ваш несвязанный итератор.

Для того чтобы выполнить итерацию по vector<X> контейнеру, вам нужен vector<X>::iterator не vector<SomethingElse>::iterator

РЕДАКТИРОВАТЬ: в ответ на новое обновление:

 for (typename std::vector<registeredObject *>::iterator itera1 = mRegistryList.begin(); itera1 != mRegistryList.end(); itera1  )
     ^^^^^^^^
  

Поскольку этот код находится в шаблоне, компилятор не знает, что std::vector<registeredObject *>::iterator является типом — вы должны указать ему, чтобы он обрабатывал его как тип, добавляя префикс typename

Комментарии:

1. @Эрик, я не понимаю, что это значит

2. @JTS: Ага. Ваш iter typedef вообще не имеет никакого отношения к вашему mRegistryList вектору

3. это означает, что определение вашего итератора должно соответствовать определению коллекции, по которой оно выполняется. если ваш контейнер является векторным<registeredObject *>, то итератором должен быть vector<registeredObject *>::iterator

4. @Erik, итак, как мне изменить свое for выше? for (vector<registeredObject *>::iterator itera1 = mRegistryList.begin(); itera1 != mRegistryList.end(); itera1 ) { Кажется неправильным

5. @JTS: typedef typename std::vector<registeredObject *>::iterator iter; — это правильный тип для повторения mRegistryList