4

Я новичок в C++/CLI и испытываю некоторые проблемы, пытающиеся переопределить метод Equal базового класса Object. Я получаю следующую ошибку предупреждения компиляции для следующего кода. Как это можно исправить?C++/CLI: как переопределить метод Equal класса Object

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(); 
} 
+0

Реализация GetHashCode должны использовать одни и те же переменные, которые вы используете в реализации Equals, такие как: int Sample::GetHashCode() { return someVariable->GetHashCode(); }

ответ

5

Имя метода не 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 
    //... 
} 
+0

Я изменил Равно Равно и удалить переопределение из исходного файла, но ошибка все равно появляется 2. –

+0

Реализация 'GetHashCode' - это' FgStatusWrapper :: GetHashCode', в то время как объявление является «Sample :: GetHashCode». –

+0

Я изменил его на Sample, но ошибка все еще появляется. –

0

извлекается из here следующее:

В соответствии с MSDN, одна из причин LNK2022 это когда структура существует в нескольких модулей одно и то же имя, но с противоречивыми определениями и при компиляции с/clr. Это обычно происходит потому, что каким-то образом компилятор помещает несколько разные метаданные в два модуля для одного и того же типа. Во время соединения, когда метаданные объединены, эта ошибка испускается, потому что имя для типа одно и то же, но в остальных метаданных, описывающих этот тип, есть некоторое расхождение.