error: conversion from long int to non-scalar type __gnu_cxx :: __ normal_iterator

أحاول تشغيل مدونة C ++ قديمة في لينكس (Redhat). أنا أستخدم gcc version 4.1.2. في ما يلي نموذج التعليمة البرمجية حيث أتلقى الخطأ:

           template  TP *GCVVector::Find(const TP &Obj)
        {
        #ifdef WIN32
                using namespace std;
                typedef typename vector::iterator Viterator;
        #else
        #ifdef __HP_aCC 
                using namespace std;
                typedef typename vector::iterator Viterator;
        #else
                using namespace std;
                typedef typename std::vector::iterator Viterator;
        #endif
        #endif

                Viterator pCurrent =NULL ;

الخطأ الذي أتلقاه هو:

         /trnuser1/rmtrain/DevelopmentEnv/Generic/CoreObjects/GCVVector.h: In member          function âTP* GCVVector::Find(const TP&) [with TP = GCVAsso::KeyNode]â:
        /trnuser1/rmtrain/DevelopmentEnv/Generic/CoreObjects/GCVAsso.h:165:   instantiated from âbool GCVAsso::Add(KTP, VTP) [with KTP = GCVString, VTP = GCVString]â
        /trnuser1/rmtrain/DevelopmentEnv/Generic/CoreObjects/GCVTransformationServices.h:69:   instantiated from here
         /trnuser1/rmtrain/DevelopmentEnv/Generic/CoreObjects/GCVVector.h:398: error: conversion from âlong intâ to non-scalar type â__gnu_cxx::__normal_iterator::KeyNode*, std::vector::KeyNode, std::allocator::KeyNode> > >â requested
           /trnuser1/rmtrain/DevelopmentEnv/Generic/CoreObjects/GCVAsso.h:165:   instantiated from âbool GCVAsso::Add(KTP, VTP) [with KTP = GCVString, VTP = GCVString]â
        /trnuser1/rmtrain/DevelopmentEnv/Generic/CoreObjects/GCVTransformationServices.h:69:   instantiated from here
        /trnuser1/rmtrain/DevelopmentEnv/Generic/CoreObjects/GCVVector.h:403: error: no match for âoperator=â in âpCurrent = GCVVector::BinarySearch [with TP = GCVAsso::KeyNode](0l, (GCVVector::GetSize [with TP = GCVAsso::KeyNode]() - 1l), ((const GCVAsso::KeyNode&)((const GCVAsso::KeyNode*)Obj)))â
        /usr/lib/gcc/x86_64-redhat-   linux/4.1.2/../../../../include/c++/4.1.2/bits/stl_iterator.h:634: note: candidates are: __gnu_cxx::__normal_iterator::KeyNode*, std::vector::KeyNode, std::allocator::KeyNode> > >& __gnu_cxx::__normal_iterator::KeyNode*, std::vector::KeyNode, std::allocator::KeyNode> > >::operator=(const __gnu_cxx::__normal_iterator::KeyNode*, std::vector::KeyNode, std::allocator::KeyNode> > >&)
        make[2]: ***    [CMakeFiles/GCVCore.dir/trnuser1/rmtrain/DevelopmentEnv/Generic/CoreObjects/GCVTransformationServices.o] Error 1
        make[1]: *** [CMakeFiles/GCVCore.dir/all] Error 2
0

2 إجابة

المكرر ليس رقماً بل هو كائن في معظم الأوقات لا يأخذ رقماً كمعلمة مُنشئ.

مجرد استبدال الخط مع

Viterator pCurrent = Viterator();

سوف يغيب عن السلوك بنفس الطريقة التي يعمل بها القانون الحالي.

0
وأضاف
Xeo أنت تقول أنك ستحتاج إلى {} لتهيئته بشكل صحيح. لن تكفي () أيضًا في C ++ 03 حتى للبنى؟ أم أن ضمان التهيئة لأول مرة في C ++ 11؟
وأضاف المؤلف RedX, مصدر
سيؤدي ذلك إلى ترك المكرر غير مهيأ ، إذا كان مؤشر أو بنية POD.
وأضاف المؤلف Xeo, مصدر
اسم النوع() ؛ يُعرف أيضًا باسم معظم التحليل المجهد في C ++ ، وظيفة. ؛)
وأضاف المؤلف Xeo, مصدر

The original code was written against an STL where std::vector::iterator was a raw pointer and so could be (and needed to be) initialised to NULL.

للتوافق الكامل ، قم بتغيير الخط إلى

Viterator pCurrent = Viterator();

في C ++ 11 ، يمكنك استخدام

Viterator pCurrent{};

بالتوافق الكامل ، من المفترض هنا أن Viterator قد يكون مجرد مؤشر فارغ. في مثل هذه الحالة ، سيتم تعيينها صراحةً إلى قيمة تم إنشاؤها افتراضيًا إلى NULL. فيما يلي مثال بسيط لإثبات ذلك.

#include 

typedef void * Iterator;

int main(int, char**)
{
  Iterator v1, v2=Iterator();
  std::cout << "uninitialized pointer: " << v1 << "\ninitialized pointer: " << v2 << std::endl;
}

الناتج هو:

uninitialized pointer: 0x7fff5fc01052
initialized pointer: 0

لاحظ أن البرنامج قد لا يزال غير صحيح إذا كان يفعل أي شيء مع pCurrent ، بخلاف تعيينه لقيمة جديدة (قد يكون صالحًا لمقارنته بنفسه ، أو تم تهيئة مُكرر آخر بنسخه ، ولكن بمقارنة ضد مُكرر غير مفرد ، أو أن مُكرِّرًا ذا قيمة افتراضية مُنشأة بشكل منفصل سيكون غير معروف).

0
وأضاف
شيو: أنت على حق !! شكرا لاختيار ذلك. قال بصراحة ، أنا ما كان عندي حاجة للتخليق ببناء أنواع بسيطة مثل ذلك ، لذا لم يحدث لي لمحاولة.
وأضاف المؤلف Kuba Ober, مصدر
Xeo: هذا فقط لإظهار أن هذا هو موقع واحد لا يصدق. لقد كنت أتعلم كل شهر. شكرا مرة أخرى ، أنا دائما أقدر عندما يشير شخص ما إلى شيء لم أكن أعرفه. المزيد من القوة لي ؛)
وأضاف المؤلف Kuba Ober, مصدر
لا يتم ضمان iterator() == iterator() . إذا كان البرنامج القديم يعتمد على التكرارات الباطلة (بدلاً من تجنب الأدوار غير المهذبة بأدب) ، فقد تظل هناك مشاكل.
وأضاف المؤلف aschepler, مصدر
Kuba: ليس إذا كان نوع المكود هو في الواقع مؤشر ، هذا سيتركه فقط غير مهيأ. في C ++ 11 ، يمكنك القيام Viterator pCurrent {} ؛ ، ولكن ليس في C ++ 03.
وأضاف المؤلف Xeo, مصدر
aschepler: حسنًا ، الشفرة الأصلية تطالب بالفعل بالمشكلات من خلال محاولة العمل على حل مشكلات القصور عن طريق التحقق من هدف التحويل البرمجي ...
وأضاف المؤلف Xeo, مصدر