使用C ++ / CLI从泛型函数返回通用列表

时间:2013-10-02 10:45:25

标签: c# generics c++-cli

我正在尝试在C ++ / CLI中编写一个通用函数,它将创建一个通用列表。列表的类型参数与通用函数的类型相同。

C#中,我只是这样做:

using System.Collections.Generic;

class MyClass
{
    static List<T> CreateList<T>()
    {
        return new List<T>();
    }
}

C ++ / CLI 中,我尝试做同样的事情,即

using namespace System::Collections::Generic;

generic <typename T>
List<T>^ MyClass::CreateList ( void )
{
    return gcnew List< T >();
}

但我得到的只是一个编译错误: 错误C2371:'list':重新定义;不同的基本类型

我做错了什么?

注意:实际的功能不仅仅是创建一个列表,而是我遇到的问题。

修改 嗨伙计们,谢谢你的回复

显然我得到的错误是误导。我创建了一个新的解决方案,只包含(除了main())MyClass,并得到了一个不同的错误。然后我尝试了Hans Passant的代码并且神奇地工作了。再看看我能看到的唯一区别是,我完全符合List类型 即System :: Collections :: Generic :: List而不是List(但为了清楚起见,我在之前的帖子中省略了它)。事实证明,编译器由于某种原因不喜欢这样。即

using namespace System::Collections::Generic;

generic <typename T>
System::Collections::Generic::List<T>^ MyClass::CreateList()
{
    //return gcnew System::Collections::Generic::List<T>;   // this gives compile error
    return gcnew List<T>;   // this is all right
}

我不知道这是一个错误还是有原因的...... 再次感谢您的帮助!

1 个答案:

答案 0 :(得分:3)

很难猜出该错误消息的来源。 “list”中的L不是大写的,请确保您没有遇到std :: list模板类的问题。确保在方法之前的前一个类声明不会缺少分号。 Anyhoo,正确的代码看起来像这样:

类声明:

using namespace System::Collections::Generic;

ref class MyClass
{
public:
    generic <typename T>
    static List<T>^ CreateList();
};                                    // <== note semi-colon here.

方法定义:

generic <typename T>
List<T>^ MyClass::CreateList()
{
    return gcnew List<T>;
}