ошибка g : ожидаемая; перед «этим»

#linux #gcc #g

#linux #gcc #g

Вопрос:

Я переношу приложение C с Solaris на Linux, и я застрял со следующей ошибкой. Код является:

 template <class MapSuperClass> class FWPointerMap : public MapSuperClass
{
  public:
    FWPointerMap()
    {
      _wipe = false;
    }

    FWPointerMap(const MapSuperClass* mMap)
    {
      MapSuperClass::const_iterator it = mMap->begin(); // line 50
      while(it != mMap->end())
      {
        insert(MapSuperClass::value_type((*it).first, (*it).second));
        it  ;
      }
      _wipe = false;
    }
  

И я получаю следующую ошибку:

 ../../framework/fwcore/hdr/FWPointerMap: In constructor FWPointerMap<MapSuperClass>::FWPointerMap(const MapSuperClass*):
../../framework/fwcore/hdr/FWPointerMap:50: error: expected ; before it
../../framework/fwcore/hdr/FWPointerMap:52: error: it was not declared in this scope
  

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

1. Не могли бы вы убрать старшие разрядные символы из вашей ошибки, чтобы она была более разборчивой?

Ответ №1:

Я думаю, вам просто нужно добавить ‘typename’, чтобы сообщить компилятору, что MapSuperClass::const_iterator является типом:

 typename MapSuperClass::const_iterator it = mMap->begin(); // line 50
  

Поскольку MaySuperClass является параметром шаблона класса, предполагается, что элемент const_iterator является полем. Использование typename сообщает компилятору, что это на самом деле тип.

Дополнительная информация: http://en.wikipedia.org/wiki/Typename#A_method_for_indicating_that_a_dependent_name_is_a_type

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

1. Большое спасибо за быстрый ответ. Теперь это работает.