C ++ / CLI:从模板类继承的函数在C#中不可见

时间:2011-12-13 19:30:08

标签: c# .net visual-studio-2010 c++-cli

我很难弄清楚如何在C#中显示父类函数。

假设我有一个模板类,它定义了一个函数foo()

template <int Dim, typename Type>
public ref class FixedNP
{
public:
  float foo() {return 1;};
};

然后我有一个继承自FixedNP模板的类:

public ref class Vector3fP : public FixedNP<3, float>
{
}

当我尝试从C#调用foo()函数时,例如

Vector3fP bar = new Vector3fP();
bar.foo();

它说功能Vector3fP不包含foo的定义。

当我将foo()的定义移动到Vector3fP类时,它工作正常。然而,这在实际代码中是不可行的,因为FixedNP模板包含了大量应该从大约4个不同类继承的函数。

在互联网上进行一些搜索后,我发现添加了

using FixedNP<3, float>::foo;

向Vector3fP修复了类似的问题。但是在我的情况下,它只会导致另一个错误,这次是在编译C ++ / CLI代码时:

  

错误C3182:'Vector3fP':成员使用声明或访问声明在托管类型中是非法的

如何在C#中显示我的功能?

2 个答案:

答案 0 :(得分:2)

我认为他们的关键是来自Managed Templates on MSDN的声明:

  

如果未实例化模板,则不会在元数据中发出该模板。如果实例化模板,则只有引用的成员函数才会出现在元数据中。

这意味着未在C ++代码中使用的函数将不在生成的DLL中,并且您将无法在C#中使用它们。要解决这个问题,你可以在你的C ++代码中添加一个虚假的函数,它引用了函数:

void phony()
{
    auto vec = gcnew Vector3fP();
    vec->foo();
}

答案 1 :(得分:0)

您可以通过添加以下行来实例化整个模板类,而无需添加phony方法。

template ref class FixedNP<3, float>;