下面的代码编译在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二角括号之间的空间。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top