خطأ C2678 بعد ترحيل رمز C ++ من VC6 إلى VS2008 - لم يتم العثور على أي مشغل يأخذ المعامل الأيسر من النوع "النوع"

StackOverflow https://stackoverflow.com/questions/968602

سؤال

ملف Code من الملفات هذه في VC6 ولكن في مقابل 2008 يعطي خطأ. يمكن لأحد أن يقول لي لماذا؟ أعتقد أنه لأنه لم يعد بإمكانك مقارنة المؤشر إلى NULL (وهو عبارة عن typedef لمدة 0). إذا كان هذا هو الحال، كيف يمكنني القيام بهذه المقارنة في VC9؟

for ( std::vector<aCattrBase*>::iterator iT = attrLst.begin(); iT < attrLst.end(); iT++)
        { 
            if ( (iT != NULL) && (*iT != NULL) ) //Error: C2678
            {
//code
}
}

خطأ C2678: ثنائي "!!

هل كانت مفيدة؟

المحلول

النوع الخاص ب "STD :: Vector :: Iterator" ليس بالضرورة نوع مؤشر حتى لا تتمكن من مقارنته ب NULL.

في برنامج التحويل البرمجي القديم، حدث فقط ليكون مؤشرا، وبالتالي جمع الكود الخاص بك. لكنك فقط حصلت على محظوظ (كما هو موضح عند نقل الكود إلى محمول مختلف).

الاختبار الوحيد في ITERATOR لديك هو مقارنتها بالإنهاء () أو بدء () أو أي جهاز كمتطفاء صالح داخل النطاق يبدأ () -> نهاية (). لأن هذا متجه، يمكنك القيام بعمليات رياضية مع جهاز كمتقل. يبدأ () يجب أن يمنحك إزاحة. ولكن هذا غير صالح لجميع الحاويات (تحقق من كل وثائق الحاويات).

كل ما عليك فعله هو اختبار ما يشير معه في:

for ( std::vector<aCattrBase*>::iterator iT = attrLst.begin();
      iT != attrLst.end();  // Changed this. Notice the !=
      ++iT)                 // Changed this. Prefer pre increment for not integer types
{ 
    if ( *iT != NULL)
    {
         //code
    }
}

نصائح أخرى

إن جهاز الكمبيوتر ليس مؤشرا، فهذا مثيل فئة ولا يحتوي على المشغل الثنائي! = لمقارنه ب NULL.

أنت تحاول مقارنة الماسير إلى NULL في الحالة الأولى في بيان IF. لا تحتاج إلى هذه المقارنة الأولى مثل جهاز الكمبيوتر الذي يجب أن يكون عليه أزال ضمن الجزء الصحيح من القائمة.

لم يكن مقارنة ماء المؤتمر إلى NULL غير قانوني. تتيح لك VC6 أن تفعل ذلك، لكنها كانت مخطئة للقيام بذلك.

في المثال أنك تعطي، فإن المقارنة لا معنى لها، حيث أن المؤتمر سيشير دائما إلى شيء ما. التحقق (* ذلك)! = NULL معقول ولا يزال يعمل.

إذا كان هناك احتمال حقيقي لا يشير جهاز كمتقل إلى كائن صالحا، فستكون VC9 وظيفة غير موثقة

IT._Has_container()

سيكون ذلك صحيحا إذا كان جهاز استئناف يشير إلى حاوية وخطأ إذا لم يذكر المؤتمر. لتعيين جهاز الكمبيوتر الخاص بالمكترونات المؤقتة إلى لا شيء، تقوم بتعيين جهاز استئناف فارغ:

IT = std::vector<aCattrBase*>::iterator();

ما ورد أعلاه يمثل شفرة غير محمولة وأسلوب ضعيف إلى حد ما ولا أوصي بتصميم أي شيء لاستخدامه. ومع ذلك، إذا كنت بحاجة إلى الحصول بسرعة على بعض الكود VC6 لتجميعها على VC9، فقد تخرجك من المتاعب.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top