有沒有人有一個如何在C++/CLI中實現IEnumerable和IEnumerator的分步實例?或者,是否有人知道如何修復MS Connect中未在Visual Studio 2005中編譯的以下代碼?C++/CLI IEnumerable和IEnumerator實現
using namespace System;
using namespace System::Collections::Generic;
generic <class T>
public ref struct MyArray : public IEnumerable<T>
{
MyArray(array<T>^ d)
{
data = d;
}
ref struct enumerator : IEnumerator<T>
{
enumerator(MyArray^ myArr)
{
colInst = myArr;
currentIndex = -1;
}
bool MoveNext()
{
if(currentIndex < colInst->data->Length - 1)
{
currentIndex++;
return true;
}
return false;
}
property T Current
{
T get()
{
return colInst->data[currentIndex];
}
};
// This is required as IEnumerator<T> also implements IEnumerator
property Object^ Current2
{
virtual Object^ get() new sealed = System::Collections::IEnumerator::Current::get
{
return colInst->data[currentIndex];
}
};
void Reset() {}
~enumerator() {}
MyArray^ colInst;
int currentIndex;
};
array<T>^ data;
IEnumerator<T>^ GetEnumerator()
{
return gcnew enumerator(this);
}
virtual System::Collections::IEnumerator^ GetEnumerator2() new sealed = System::Collections::IEnumerable::GetEnumerator
{
return gcnew enumerator(this);
}
};
int main()
{
int retval = 0;
MyArray<int>^ col = gcnew MyArray<int>(gcnew array<int>{10, 20, 30 });
for each(Object^ c in col)
{
retval += (int)c;
}
retval -= 10 + 20 + 30;
Console::WriteLine("Return Code: {0}", retval);
return retval;
}
編譯器不能找到枚舉的方法實現:
error C3766: 'MyArray<T>::enumerator' must provide an implementation for the interface method 'bool System::Collections::IEnumerator::MoveNext(void)' c:\Projects\VCNET\2005\IEnumerable\IEnumerable\IEnumerable.cpp 55
error C3766: 'MyArray<T>::enumerator' must provide an implementation for the interface method 'void System::Collections::IEnumerator::Reset(void)' c:\Projects\VCNET\2005\IEnumerable\IEnumerable\IEnumerable.cpp 55
error C3766: 'MyArray<T>::enumerator' must provide an implementation for the interface method 'T System::Collections::Generic::IEnumerator<T>::Current::get(void)' c:\Projects\VCNET\2005\IEnumerable\IEnumerable\IEnumerable.cpp 55
error C3766: 'MyArray<T>' must provide an implementation for the interface method 'System::Collections::Generic::IEnumerator<T> ^System::Collections::Generic::IEnumerable<T>::GetEnumerator(void)' c:\Projects\VCNET\2005\IEnumerable\IEnumerable\IEnumerable.cpp 68
嘗試以防萬一。 (是的,我知道'ref struct'應該默認爲public)。或者使用顯式覆蓋符號,就像你爲'Current2 :: get'和'GetEnumerator2'所做的那樣,並讓編譯器告訴你爲什麼它不覆蓋。 – 2011-02-23 01:36:00
您是否嘗試過Jamie所說的關於標記所有這些「虛擬」功能? – 2011-02-23 01:37:47