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

本文关键字:函数 继承 CLI c++ | 更新日期: 2023-09-27 18:17:39

我很难弄清楚如何在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':成员using声明或访问声明在托管类型中是非法的

有什么建议如何使我的函数在c#中可见?

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

我认为关键在于MSDN管理模板的声明:

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

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

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

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

template ref class FixedNP<3, float>;