отсутствующий ;перед идентификатором при компиляции кода VC6 в VC9
Вопрос
Следующий код собирает нормально в 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> >
Обратите внимание на пространство между двумя последними угловыми скобками.