مفقود ؛ قبل المعرف أثناء تجميع رمز VC6 في VC9
سؤال
يشكل التعليمة البرمجية التالية بشكل جيد في 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 قادرا على المساعدة.
المحلول
قد تحتاج إلى إدراج "TypeName"، لإخبار برنامج التحويل البريمي للمترجم :: ITERATOR، في جميع الحالات، نوع.
على سبيل المثال
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;
وبعد يفكر مترجم خلاف ذلك في أن Symer_Map :: ITERATOR هو كائن ثابت ولن يكون قادرا على التعرف عليه كنوع. لذلك عليك أن تعطي تلميح للمترجم الذي يشير إلى أنه نوع وليس كائن ثابت.
قد تكون سقوط ضحية مشكلة قالب شائعة:
class cKey = int, class cCompare = less<cKey>>
يجب ان يكون:
class cKey = int, class cCompare = less<cKey> >
لاحظ المسافة بين أقواس زاوية LLAST.
لا تنتمي إلى StackOverflow