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

sta*_*tiv 5 .net c# c++-cli visual-studio-2010

我很难弄清楚如何在 C# 中使父类函数可见。

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

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

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

public ref class Vector3fP : public FixedNP<3, float>
{
}
Run Code Online (Sandbox Code Playgroud)

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

Vector3fP bar = new Vector3fP();
bar.foo();
Run Code Online (Sandbox Code Playgroud)

它说函数 Vector3fP 不包含 foo 的定义。

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

在互联网上搜索后,我发现添加

using FixedNP<3, float>::foo;
Run Code Online (Sandbox Code Playgroud)

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

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

任何建议如何使我的函数在 C# 中可见?

svi*_*ick 2

我认为关键在于MSDN 上托管模板的这一声明:

\n\n
\n

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

\n
\n\n

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

\n\n
void phony()\n{\n    auto vec = gcnew Vector3fP();\n    vec->foo();\n}\n
Run Code Online (Sandbox Code Playgroud)\n