0

次のコードは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に移行した経験のある人が助けになるかもしれません。

4

3 に答える 3

6

コンパイラにPRIMARY_MAP::iteratorがすべての場合でタイプであることを伝えるために、「typename」を挿入する必要がある場合があります。

例えば

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> >

最後の2つの山形ブラケットの間のスペースに注意してください。

于 2009-06-05T10:13:51.930 に答える