Why can't I create a templated sublcass of System::Collections::Generic::IEnumerable<T>?

Posted by fiirhok on Stack Overflow See other posts from Stack Overflow or by fiirhok
Published on 2010-04-02T19:11:06Z Indexed on 2010/04/02 19:13 UTC
Read the original article Hit count: 134

Filed under:
|
|

I want to create a generic IEnumerable implementation, to make it easier to wrap some native C++ classes. When I try to create the implementation using a template parameter as the parameter to IEnumerable, I get an error.

Here's a simple version of what I came up with that demonstrates my problem:

ref class A {};

template<class B>
ref class Test : public System::Collections::Generic::IEnumerable<B^> // error C3225...
{};

void test()
{
    Test<A> ^a = gcnew Test<A>();
}

On the indicated line, I get this error:

error C3225: generic type argument for 'T' cannot be 'B ^', it must be a value type or a handle to a reference type

If I use a different parent class, I don't see the problem:

template<class P>
ref class Parent {};

ref class A {};

template<class B>
ref class Test : public Parent<B^> // no problem here
{};

void test()
{
    Test<A> ^a = gcnew Test<A>();
}

I can work around it by adding another template parameter to the implementation type:

ref class A {};

template<class B, class Enumerable>
ref class Test : public Enumerable
{};

void test()
{
    using namespace System::Collections::Generic;
    Test<A, IEnumerable<A^>> ^a = gcnew Test<A, IEnumerable<A^>>();
}

But this seems messy to me. Also, I'd just like to understand what's going on here - why doesn't the first way work?

© Stack Overflow or respective owner

Related posts about c++cli

Related posts about templates