【发布时间】:2011-12-13 19:30:08
【问题描述】:
我很难弄清楚如何使父类函数在 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# 中可见吗?
【问题讨论】:
-
模板没有外部链接。不在 C++ 中,也不在 C++/CLI 中。您必须使用 generic 关键字。
int Dim不会飞。 msdn.microsoft.com/en-us/library/8z2kbc1y.aspx -
我知道,这就是我从模板继承“常规”类的原因之一。
-
我也很确定我在这里不想要泛型。首先我希望在编译时完成,其次我真的需要
参数是 int,因为我稍后将它用作模板参数。 -
嗯,根据 MSDN,它们可以被管理:msdn.microsoft.com/en-us/library/ms177213.aspx 此外,当尝试混合原生代码和托管代码时,VS 会告诉你。
-
我刚刚找到了一个部分解决方案——如果我在 FixedNP::foo() 声明中添加 virtual 关键字,它就可以工作。不幸的是,这对静态函数没有用。这是一个相当大的问题,因为 FixedNP 模板中的许多函数都是重载的运算符……
标签: c# .net visual-studio-2010 c++-cli