C++/CLI IEnumerable 和 IEnumerator 实现

发布于 2024-10-19 03:50:15 字数 3261 浏览 2 评论 0原文

有没有人有一个关于如何在 C++/CLI 中实现 IEnumerable 和 IEnumerator 的可行的分步示例?或者,有人知道如何修复 MS Connect 中无法在 Visual Studio 2005 中编译的以下代码吗?

http:// /connect.microsoft.com/VisualStudio/feedback/details/101089/how-to-implement-ienumerable-t-and-ienumerable-c-cli

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  

Does anyone have a working, step-by-step example of how to implement IEnumerable and IEnumerator in C++/CLI? Alternatively, does someone know how to fix the following code from MS Connect which does not compile in Visual Studio 2005?

http://connect.microsoft.com/VisualStudio/feedback/details/101089/how-to-implement-ienumerable-t-and-ienumerable-c-cli

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;
}

The compiler is unable to find the enumerator method implementations:

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  

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

梦巷 2024-10-26 03:50:15

这对我来说没有任何警告(在 VS2010 上)编译:

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;
        }

        virtual bool MoveNext() = IEnumerator<T>::MoveNext
        {
            if( currentIndex < colInst->data->Length - 1 )
            {
                currentIndex++;
                return true;
            }
            return false;
        }

        property T Current
        {
            virtual T get() = IEnumerator<T>::Current::get
            {
                return colInst->data[currentIndex];
            }
        };
        // This is required as IEnumerator<T> also implements IEnumerator
        property Object^ Current2
        {
            virtual Object^ get() = System::Collections::IEnumerator::Current::get
            {
                return colInst->data[currentIndex];
            }
        };

        virtual void Reset() = IEnumerator<T>::Reset {}
        ~enumerator() {}

        MyArray^ colInst;
        int currentIndex;
    };

    array<T>^ data;

    virtual IEnumerator<T>^ GetEnumerator()
    {
        return gcnew enumerator(this);
    }

    virtual System::Collections::IEnumerator^ GetEnumerator2() = 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;
}

This compiles for me without a single warning (on VS2010):

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;
        }

        virtual bool MoveNext() = IEnumerator<T>::MoveNext
        {
            if( currentIndex < colInst->data->Length - 1 )
            {
                currentIndex++;
                return true;
            }
            return false;
        }

        property T Current
        {
            virtual T get() = IEnumerator<T>::Current::get
            {
                return colInst->data[currentIndex];
            }
        };
        // This is required as IEnumerator<T> also implements IEnumerator
        property Object^ Current2
        {
            virtual Object^ get() = System::Collections::IEnumerator::Current::get
            {
                return colInst->data[currentIndex];
            }
        };

        virtual void Reset() = IEnumerator<T>::Reset {}
        ~enumerator() {}

        MyArray^ colInst;
        int currentIndex;
    };

    array<T>^ data;

    virtual IEnumerator<T>^ GetEnumerator()
    {
        return gcnew enumerator(this);
    }

    virtual System::Collections::IEnumerator^ GetEnumerator2() = 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;
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文