Реализация GetEnumerator в C ++ - PullRequest
3 голосов
/ 04 мая 2009

В C # у меня есть следующий класс, и он прекрасно компилируется:

class CustomItem { }</p> <pre><code>class CustomList : IList<CustomItem> { public CustomItem this[int index] { get { return null; } set { throw new NotImplementedException(); } } public void CopyTo(CustomItem[] array, int arrayIndex) { } public int Count { get { return 10; } } public int IndexOf(CustomItem item) { throw new NotImplementedException(); } public void Insert(int index, CustomItem item) { throw new NotImplementedException(); } public void RemoveAt(int index) { throw new NotImplementedException(); } public void Add(CustomItem item) { throw new NotImplementedException(); } public void Clear() { throw new NotImplementedException(); } public bool Contains(CustomItem item) { throw new NotImplementedException(); } public bool IsReadOnly { get { return true; } } public bool Remove(CustomItem item) { throw new NotImplementedException(); } public IEnumerator<CustomItem> GetEnumerator() { throw new NotImplementedException(); } System.Collections.IEnumerator System.Collections.IEnumerable.GetEnumerator() { throw new NotImplementedException(); } }

Когда я пытаюсь сделать то же самое в C ++, я получаю несколько ошибок компилятора:

ref class CustomItemValue { };</p> <pre><code>typedef CustomItemValue^ CustomItem; ref class CustomList : public IList<CustomItem> { public: property CustomItem default[int] { virtual CustomItem get(int index) { return nullptr; } virtual void set(int index, CustomItem value) {} } virtual void CopyTo(array<CustomItem>^ array, int arrayIndex) { } property int Count { virtual int get() { return 10; } } virtual int IndexOf(CustomItem item) { throw gcnew NotImplementedException(); } virtual void Insert(int index, CustomItem item) { throw gcnew NotImplementedException(); } virtual void RemoveAt(int index) { throw gcnew NotImplementedException(); } virtual void Add(CustomItem item) { throw gcnew NotImplementedException(); } virtual void Clear() { throw new NotImplementedException(); } virtual bool Contains(CustomItem item) { throw gcnew NotImplementedException(); } property bool IsReadOnly { virtual bool get() { return true; } } virtual bool Remove(CustomItem item) { throw gcnew NotImplementedException(); } virtual IEnumerator<CustomItem>^ GetEnumerator() { throw gcnew NotImplementedException(); } virtual System::Collections::IEnumerator^ GetEnumerator() { throw gcnew NotImplementedException(); } };

Сообщения об ошибках от компилятора:

.\mc.cpp(38) : error C2556: 'System::Collections::IEnumerator ^CustomList::GetEnumerator(void)' : overloaded function differs only by return type from 'System::Collections::Generic::IEnumerator ^CustomList::GetEnumerator(void)' with [ T=CustomItem ] .\mc.cpp(36) : see declaration of 'CustomList::GetEnumerator' .\mc.cpp(38) : error C2371: 'CustomList::GetEnumerator' : redefinition; different basic types .\mc.cpp(36) : see declaration of 'CustomList::GetEnumerator'

Может ли кто-нибудь помочь мне с этим?

Ответы [ 2 ]

4 голосов
/ 04 мая 2009

Вам необходимо использовать специальный явный синтаксис Microsoft для переопределения обоих методов GetEnumerator ():

virtual System::Collections::IEnumerator^ GetEnumerator2() = System::Collections::IEnumerable::GetEnumerator
{ throw gcnew NotImplementedException(); }

virtual IEnumerator<CustomItem>^ GetEnumerator()
{ throw gcnew NotImplementedException(); }

Обратите внимание, что я переименовал неуниверсальный метод GetEnumerator в GetEnumerator2, а затем указывает, что он переопределяет System :: Collections :: IEnumerable :: GetEnumerator. Вы можете узнать больше о явном переопределении в здесь

0 голосов
/ 04 мая 2009

Ну, у вас есть подсказка в сообщении об ошибке. ваш метод GetEnumerator возвращает System :: Collections :: IEnumerator ^, в то время как есть другой метод для этого класса, который возвращает System :: Collections :: Generic :: IEnumerator ^, этот метод, вероятно, унаследован от класса IList.

Попробуйте заменить возвращаемое значение на System :: Collections :: Generic :: IEnumerator ^.

...