题
下面的代码编译在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
}
对什么是错在这里的任何想法?有人用VC6从VC2005到/ 2008迁移C ++代码的经验也许能提供帮助。
解决方案
您可能需要插入“类型名称”,告诉编译器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
}
其他提示
应当typename PRIMARY_MAP::iterator m_pItr;
。否则,编译器认为PRIMARY_MAP :: iterator是一个静态的对象,就无法将其识别为一个类型。因此,你必须得到提示给编译器指示它是一种类型的,而不是静态对象。
您可能会堕入一个通用模板的问题:
class cKey = int, class cCompare = less<cKey>>
应该是:
class cKey = int, class cCompare = less<cKey> >
请注意的llast二角括号之间的空间。
不隶属于 StackOverflow