失踪 ;在VC9中编译VC6代码时的标识符之前

时间:2009-06-05 10:09:45

标签: c++ migration vc6

以下代码在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的经验的人可能会提供帮助。

3 个答案:

答案 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两个尖括号之间的空间。