以下代码在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
}
这里有什么错误吗?具有将VC ++代码从VC6迁移到VC2005 / 2008的经验的人可能会提供帮助。
答案 0 :(得分:6)
你可能需要插入'typename',告诉编译器PRIMARY_MAP :: iterator在所有情况下都是一个类型。
e.g。
class GCache
{
private:
typedef map<pKey, Data, pCompare> PRIMARY_MAP;
PRIMARY_MAP pMap;
typename PRIMARY_MAP::iterator m_pItr;
//Code truncated
}
答案 1 :(得分:3)
应该是typename PRIMARY_MAP::iterator m_pItr;
。否则编译器认为PRIMARY_MAP :: iterator是一个静态对象,并且无法将其识别为类型。所以你必须给编译器一个提示,指出它是一个类型而不是一个静态对象。
答案 2 :(得分:1)
您可能会成为常见模板问题的受害者:
class cKey = int, class cCompare = less<cKey>>
应该是:
class cKey = int, class cCompare = less<cKey> >
注意llast两个尖括号之间的空间。