Bezdepbonusu7Программирование: статьи и ответы

Вопрос

C++/CLI: реализация IList и IList‹T› (явная реализация индексатора по умолчанию)

Автор вопроса: Rasmus FaberОтветов: 3

Я пытаюсь реализовать класс С++/CLI, который реализует как IList, так и IList<T>.

Так как они имеют перекрывающиеся имена, я должен реализовать одно из них явно, и естественным выбором должен быть IList.

Неявная реализация индексатора:

using namespace System::Collections::Generic;
generic<class InnerT> public ref class MyList : public System::Collections::IList, IList<InnerT> {
  // ...
  property InnerT default[int]{
    virtual InnerT get(int index);
    virtual void set(int index, InnerT item);
  }
}

Сейчас я пытаюсь объявить индексатор по умолчанию для IList.

Мое предположение будет примерно таким:

  property Object^ System::Collections::IList::default[int]{
    virtual Object^ System::Collections::IList::get(int index);
    virtual void System::Collections::IList::set(int index, Object^ item);
  }

но это просто дает мне

ошибка C2061: синтаксическая ошибка: идентификатор "по умолчанию"

Любые подсказки?

  • Пожалуйста, измените реализации как IList, так и IList. для реализации как IList, так и IList‹T›. Jukka Dahlbom 27.03.2009
  • Спасибо! Кажется, уценка удаляла "T". Rasmus Faber 27.03.2009

c++-cliindexerexplicit-interface

Ответы

Ответ 1 · рейтинг 5 · Rasmus Faber

JaredPar answer а> почти сработало. Следует изменить две вещи:

  • Свойству-индексатору нужно другое имя, так как "по умолчанию" уже занято неявной реализацией.
  • Спецификация переопределения должна выполняться в методах set и get, а не в самом свойстве.

I.e.:

  property Object^ IListItems[int]{
    virtual Object^ get(int index) = System::Collections::IList::default::get;
    virtual void set(int index, Object^ item)  = System::Collections::IList::default::set;
  }

Ответ 2 · рейтинг 2 · JaredPar

Я не делал много интерфейсов в C++/CLI, но это, кажется, охвачено 8.8.10.1 спецификация C++/CLI. Я считаю, что функция, которую вы ищете, является явным переопределением. При этом вы должны указать реализованный член после определения, например.

property Object^ default[int] = System::Collections::IList::default {... }

Ответ 3 · abatishchev

Я скомпилировал класс, реализующий IList<T>, явно написанный на C#, открыл его с помощью Reflector и дизассемблировал в C++/CLI.

T System::Collections::Generic::IList<T>::get_Item(Int32 __gc* index)
{
   //
}

void __gc* System::Collections::Generic::IList<T>::set_Item(Int32 __gc* index, T value)
{
   //
}

Но не компилируется: get_Item, set_Item не является членом IList<T>;

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы