С++/CLI:Как переопределить метод Equal класса Object
-
11-09-2019 - |
Вопрос
Я новичок в 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();
}
Решение
Название метода не 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.Обычно это происходит потому, что каким-то образом компилятор помещает несколько разные метаданные в два модуля одного и того же типа.Во время компоновки, когда метаданные объединяются, выдается эта ошибка, поскольку имя типа одно и то же, но в остальных метаданных, описывающих этот тип, имеется некоторое несоответствие.