0

以下代码在 VC6 中编译良好,但是当我在 VS2008 中编译相同的项目时,它给出以下错误错误 C2146: syntax error : missing ';' 在标识符“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 经验的人可能会提供帮助。

4

3 回答 3

6

您可能需要插入“typename”,以告诉编译器 PRIMARY_MAP::iterator 在所有情况下都是一种类型。

例如

class  GCache
{
    private:

        typedef map<pKey, Data, pCompare> PRIMARY_MAP;
        PRIMARY_MAP pMap;

        typename PRIMARY_MAP::iterator m_pItr;

//Code truncated
}
于 2009-06-05T10:17:09.833 回答
3

应该是typename PRIMARY_MAP::iterator m_pItr;。否则编译器认为 PRIMARY_MAP::iterator 是一个静态对象,将无法将其识别为一种类型。所以你必须给编译器一个提示,表明它是一个类型而不是一个静态对象。

于 2009-06-05T10:18:01.390 回答
1

您可能会成为常见模板问题的受害者:

class cKey = int, class cCompare = less<cKey>>

应该:

class cKey = int, class cCompare = less<cKey> >

注意最后两个尖括号之间的空格。

于 2009-06-05T10:13:51.930 回答