C ++ / CLI: как переопределить метод Equal класса Object - PullRequest
4 голосов
/ 02 декабря 2009

Я новичок в 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();
}

Ответы [ 2 ]

6 голосов
/ 02 декабря 2009

Название метода не 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 голосов
/ 02 декабря 2009

Следующее извлечено из здесь :

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...