我很难弄清楚如何在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();
}