Преобразование старого проекта 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 ошибки:

  1. at myColumnItemSorterClass -> Класс не может реализовать функцию-член интерфейса "System::Collections::IComparer::Compare" (объявлено в "C:...\NETFramework\v4.0\mscorlib.dll)

  2. при сравнении -> квалифицированное имя не допускается

Есть идеи, как я могу их исправить?

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;
    }
};
Другие вопросы по тегам