运维开发网

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

运维开发网 https://www.qedev.com 2020-03-07 08:45 出处:网络 作者:运维开发网整理
我很难弄清楚如何在C#中显示父类函数. 假设我有一个模板类,它定义了一个函数foo() template <int Dim, typename Type> public ref class FixedNP { public: float foo() {return 1;}; }; 然后我有一个继承自FixedNP模板的类: public ref class Vector3fP : public
我很难弄清楚如何在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/C++LI代码时:

error C3182: ‘Vector3fP’ : a member using-declaration or access declaration is illegal within a managed type

有关如何在C#中显示我的函数的任何建议吗?

我认为它们的关键在于 Managed Templates on MSDN的这个主张:

If a template is not instantiated, it’s not emitted in the metadata. If a template is instantiated, only referenced member functions will appear in metadata.

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

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

精彩评论

暂无评论...
验证码 换一张
取 消