C ++でのGetEnumeratorの実装
-
03-07-2019 - |
質問
C#には次のクラスがあり、正常にコンパイルされます。
クラスCustomItem
{
}
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クラスCustomItemValue
{
};
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):エラーC2556: 'System :: Collections :: IEnumerator ^ CustomList :: GetEnumerator(void)':オーバーロードされた関数は、 'System :: Collections :: Generic :: IEnumerator ^からの戻り値のタイプによってのみ異なります^ CustomList :: GetEnumerator(void) '
と
[
T = CustomItem
]
。\ mc.cpp(36):「CustomList :: GetEnumerator」の宣言を参照
。\ mc.cpp(38):エラーC2371: 'CustomList :: GetEnumerator':再定義。さまざまな基本タイプ
。\ mc.cpp(36):「CustomList :: GetEnumerator」の宣言を参照
これで誰か助けてもらえますか?
解決
両方のGetEnumerator()メソッドをオーバーライドするには、Microsoft固有の明示的なオーバーライド構文を使用する必要があります。
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をオーバーライドすることを指定していることに注意してください。明示的なオーバーライドの詳細については、こちら
をご覧ください。他のヒント
エラーメッセージにヒントがあります。 GetEnumeratorメソッドはSystem :: Collections :: IEnumerator ^を返しますが、このクラスには別のメソッドが返されます System :: Collections :: Generic :: IEnumerator ^、このメソッドはおそらくIListクラスから継承されます。
戻り値をSystem :: Collections :: Generic :: IEnumerator ^で置き換えてみてください。