代码之家  ›  专栏  ›  技术社区  ›  bobbyalex

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

  •  0
  • bobbyalex  · 技术社区  · 17 年前

    下面的代码在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
    }
    

    你知道这里出了什么问题吗?有人将C++代码从VC6迁移到VC2005/2008的经验可能会有所帮助。

    3 回复  |  直到 17 年前
        1
  •  6
  •   Tobi    17 年前

    您可能需要插入'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
    }
    
        2
  •  3
  •   Naveen    17 年前

    应该是 typename PRIMARY_MAP::iterator m_pItr; . 否则,编译器会认为PRIMARY_MAP::iterator是一个静态对象,无法将其识别为类型。因此,您必须给编译器一个提示,指示它是一个类型而不是静态对象。

        3
  •  1
  •   anon anon    17 年前

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

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

    应该是:

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