отсутствующий ;перед идентификатором при компиляции кода VC6 в VC9

StackOverflow https://stackoverflow.com/questions/955162

  •  11-09-2019
  •  | 
  •  

Вопрос

Следующий код собирает нормально в VC6, но когда я составляю тот же проект в VS2008, он дает следующую ошибку ошибки C2146:ошибка синтаксиса :отсутствующий ';' Перед идентификатором 'm_pitr'

template <class pKey, class Data, class pCompare, 
          class hKey = int, class hCompare = less<hKey>,
          class sKey = int, class sCompare = less<sKey>,
          class tKey = int, class tCompare = less<tKey>,
          class cKey = int, class cCompare = less<cKey>>

class  GCache
{
    private:

        typedef map<pKey, Data, pCompare> PRIMARY_MAP;
        PRIMARY_MAP pMap;

        PRIMARY_MAP::iterator m_pItr; //error here

//Code truncated
}

Есть идеи, что здесь не так?Кто-то, имеющий опыт миграции кода C++ с VC6 на VC2005/2008, может помочь.

Это было полезно?

Решение

Возможно, вам придется вставить «имя типа», чтобы сообщить компилятору, что PRIMARY_MAP::iterator во всех случаях является типом.

например

class  GCache
{
    private:

        typedef map<pKey, Data, pCompare> PRIMARY_MAP;
        PRIMARY_MAP pMap;

        typename PRIMARY_MAP::iterator m_pItr;

//Code truncated
}

Другие советы

Должен быть typename PRIMARY_MAP::iterator m_pItr; .В противном случае компилятор считает, что PRIMARY_MAP::iterator является статическим объектом и не сможет распознать его как тип.Поэтому вам нужно дать компилятору подсказку, указывающую, что это тип, а не статический объект.

Возможно, вы стали жертвой распространенной проблемы с шаблонами:

class cKey = int, class cCompare = less<cKey>>

должно быть:

class cKey = int, class cCompare = less<cKey> >

Обратите внимание на пространство между двумя последними угловыми скобками.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top