سؤال

أنا مبتدئ إلى C ++ / CLI ويواجه بعض المشكلات في محاولة تجاوز طريقة تكافؤ فئة كائن الأساس. أحصل على خطأ تحذير تجميع التالي للتعليمات التالية. كيف يجب تصحيح هذا؟

Warning 1   warning C4490: 'override' : incorrect use of override specifier; 'Test::Sample::Equal' does not match a base ref class method   c:\project\code\Sample.h    18  

Error   2   error LNK2022: metadata operation failed (80131187) : Inconsistent method declarations in duplicated types (types: Test.Sample; methods: Equal): (0x06000002).  Sample.obj

تحرير 3: لقد غيرت "متساو" إلى "يساوي"، وإزالة التجاوز الكلمة الرئيسية في ملف المصدر ولكن الخطأ 2 لا يزال يقف.

// الملف الاساسي

public ref class Sample : public Object
{
    public:
        int someVariable;

    virtual bool Equals(Object^ obj) override;
    virtual int GetHashCode() override;
}

// مصدر الملف

bool Sample::Equals(Object^ obj)
{ 
    if ( obj == nullptr || GetType() != obj->GetType() )
        return false;

    Sample^ p = dynamic_cast<Sample^>(obj);
    return (someVariable == p->someVariable);
}

int Sample::GetHashCode()
{
    return GetHashCode();
}
هل كانت مفيدة؟

المحلول

اسم الطريقة ليست كذلك Equal, ، إنه Equals. وبعد يجب أن لا تستخدم virtual أو override الكلمات الرئيسية في التنفيذ:

ref class Test {
public:
    virtual bool Equals(Object^ o) override; 
    virtual int GetHashCode() override;

};
bool Test::Equals(Object^ o) { // no "override" here 
    //...
}
int Test::GetHashCode() { // no "override" here
    //...
}

نصائح أخرى

يتم استخراج ما يلي من هنا:

وفقا ل MSDN، أحد أسباب LNK2022 هو عندما توجد بنية في وحدات متعددة بنفس الاسم، ولكن مع تعريفات متضاربة، وعندما تجميعها مع / CLR. يحدث هذا عادة لأن التحويل البرمجي يضع بطريقة أو بأخرى بيانات تعريف مختلفة قليلا في وحدتين لنفس النوع. في الوقت الرابط، عند دمج البيانات التعريفية، يتم تنظيم هذا الخطأ لأن اسم النوع هو نفسه، ولكن هناك بعض النزح في بقية البيانات الوصفية التي تصف هذا النوع.

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