отсутствует ; перед идентификатором при компиляции кода VC6 в VC9 - PullRequest
0 голосов
/ 05 июня 2009

Следующий код прекрасно компилируется в 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.

Ответы [ 3 ]

6 голосов
/ 05 июня 2009

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

, например

class  GCache
{
    private:

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

        typename PRIMARY_MAP::iterator m_pItr;

//Code truncated
}
3 голосов
/ 05 июня 2009

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

1 голос
/ 05 июня 2009

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

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

должно быть:

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

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

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