定义具有相同名称和不同类型参数的泛型类(C ++ / CLI)

时间:2012-08-20 12:06:40

标签: .net generics c++-cli managed

在C#中,人们可以这样写:

public static class Test
{
}
public class Test<T>
{
}

如何在C ++ / CLI中执行相同的操作?

我试图定义:

public ref class Test abstract sealed
{
};

generic<typename T>
public ref class Test
{
};

但是我得到了一个C2011错误:“'class'类型重新定义。

我想创建一个静态类,它定义了创建泛型类实例的便捷方法,就像System.Tuple一样。

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:2)

要说清楚,你想这样做:

generic<typename T>
public ref class Test {};

generic<typename T, typename U>
public ref class Test {};

您无法在C ++ / CLI中执行此操作。这是一个缺陷,因为CLR允许这样做。但它是从C ++继承的。 C ++ / CLI语言使用了很多C ++编译器的管道,并在此过程中继承了它的命名规则。您可以发布到connect.microsoft.com,但这将“按设计”快速关闭。

唯一正确的方法是将这些泛型类型移动到您在C ++ / CLI项目中引用的C#类库中。或者通过解决重命名其他类的妥协,像Test2这样的东西是可口的。这确实反映了这些类完全不相关的现实。

答案 1 :(得分:0)

C ++中没有静态类的概念,即使在C ++ / CLI中也没有。这已经讨论过了here

但是,如果你想在静态类中模拟事物,解决方法是放置一些静态函数,可以调用它来初始化静态成员而不创建实例。

class Test
{
 public:
  static int InitializeGenerics(...);
}

可以轻松调用Test::InitializeGenerics()