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

Я пытаюсь реализовать класс С++/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: синтаксическая ошибка: идентификатор «по умолчанию»

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


person Rasmus Faber    schedule 27.03.2009    source источник
comment
Пожалуйста, измените реализации как IList, так и IList. для реализации как IList, так и IList‹T›.   -  person Jukka Dahlbom    schedule 27.03.2009
comment
Спасибо! Кажется, уценка удаляла «T».   -  person Rasmus Faber    schedule 27.03.2009


Ответы (3)



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

property Object^ default[int] = System::Collections::IList::default {... }
person JaredPar    schedule 27.03.2009

Я скомпилировал класс, реализующий 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>;

person abatishchev    schedule 27.03.2009
comment
Reflector дизассемблируется в Managed C++, а не в C++/CLI. Управляемый C++ — это более старые расширения управляемого кода. Вы можете сказать это по всем указателям __gc. - person Jeff Mc; 27.03.2009
comment
Существует расширение для Reflector, которое может генерировать C++/CLI. К сожалению, это также дало некомпилируемый код. - person Rasmus Faber; 27.03.2009