gpt4 book ai didi

templates - 为什么我不能创建 System::Collections::Generic::IEnumerable 的模板化子类?

转载 作者:行者123 更新时间:2023-12-01 02:57:05 25 4
gpt4 key购买 nike

我想创建一个通用的 IEnumerable 实现,以便更容易地包装一些 native C++ 类。当我尝试使用模板参数作为 IEnumerable 的参数创建实现时,出现错误。

这是我提出的一个简单版本,它展示了我的问题:

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

在指示的行上,我收到此错误:

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



如果我使用不同的父类,我看不到问题:
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>();
}

我可以通过向实现类型添加另一个模板参数来解决它:
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^>>();
}

但这对我来说似乎很困惑。另外,我只想了解这里发生了什么 - 为什么第一种方法不起作用?

最佳答案

在您的第一个示例中,您的继承行应为:

ref class Test : public System::Collections::Generic::IEnumerable<B>

(模板上没有引用标记)

然后你的用法行应该是:
Test<A^> ^a = gcnew Test<A^>();

引用标记用于模板的实例化,而不是模板本身。

这是您的示例,可编译:
using namespace System;
using namespace System::Collections::Generic;

ref class A {};

template<class B> ref class Test : public System::Collections::Generic::IEnumerable<B>
{
public:
B GetInstance()
{
return Activator::CreateInstance<B>();
}

virtual System::Collections::IEnumerator^ GetEnumeratorObj() =
System::Collections::IEnumerable::GetEnumerator
{
return nullptr;
}

virtual System::Collections::Generic::IEnumerator<B>^ GetEnumerator()
{
return nullptr;
}
};

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

编辑:意识到我应该解释为什么会这样。据我所知,您不能在 IEnumerable 继承中指定 B^ 的原因是 IEnumerable 是具有约束的泛型,而 B 是不受约束的模板参数。模板允许更灵活的语法,即使它们管理 ref 对象,因为即使在 C++/CLI 中它们仍然有效地“解析文本”。然而,当他们遇到带有约束的泛型时,规则会变得更加严格。

关于templates - 为什么我不能创建 System::Collections::Generic::IEnumerable<T> 的模板化子类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2568616/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com