Преобразование старого проекта Managed-C++ в новый C++/CLI
У меня есть этот старый проект, написанный с использованием oldSyntax. В VS2012 он работал просто отлично, но я вижу, что в VS2015 /clr:oldSyntax больше не доступен, и, как я ожидал, у меня много ошибок. Мне удалось избавиться от некоторых из них, но теперь я заблокирован в следующих строках кода:
ref class myColumnItemSorterClass : public IComparer
{
int IComparer::Compare(Object^ x, Object^ y)
{
if (x && y) {
ColumnItemType^ pSSx = dynamic_cast<ColumnItemType^>(x);
ColumnItemType^ pSSy = dynamic_cast<ColumnItemType^>(y);
if (pSSx->Position&&pSSx->Position->Length>0 &&
pSSy->Position&&pSSy->Position->Length>0) {
int xPos = Convert::ToInt32(pSSx->Position);
int yPos = Convert::ToInt32(pSSy->Position);
if (xPos < yPos) {
return -1;
} else if (xPos > yPos) {
return 1;
} else {
return 0;
}
} else {
return 0;
}
} else {
return 0;
}
}
};
Есть 2 ошибки:
at myColumnItemSorterClass -> Класс не может реализовать функцию-член интерфейса "System::Collections::IComparer::Compare" (объявлено в "C:...\NETFramework\v4.0\mscorlib.dll)
при сравнении -> квалифицированное имя не допускается
Есть идеи, как я могу их исправить?
1 ответ
Переопределенный интерфейсный метод должен быть virtual
а также public
и может быть sealed
предотвратить производный класс от повторной реализации метода.
Не указывайте метод с именем интерфейса (например: IComparer::Compare
). Компилятор интерпретирует это как неудачную попытку определить явное переопределение (см. Ошибка компилятора C3253).
ref class myColumnItemSorterClass : IComparer
{
public:
virtual int Compare(Object^ x, Object^ y)
{
/*...*/
return 0;
}
};
Если вы хотите, чтобы переопределенный метод был доступен только через дескриптор интерфейса, вы можете использовать явное переопределение. Переопределенный метод все еще должен быть virtual
, но может быть private
и должно быть sealed
,
ref class myColumnItemSorterClass : IComparer
{
private:
virtual int CompareExplicit(Object^ x, Object^ y) sealed = IComparer::Compare
{
/*...*/
return 0;
}
};