Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C++/CLI:从模板类继承的函数在C中不可见#_C#_.net_Visual Studio 2010_C++ Cli - Fatal编程技术网

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

C# C++/CLI:从模板类继承的函数在C中不可见#,c#,.net,visual-studio-2010,c++-cli,C#,.net,Visual Studio 2010,C++ Cli,我很难弄明白如何使父类函数在C#中可见 假设我有一个模板类,它定义了一个函数foo() 它说Vector3fP函数不包含foo的定义 当我将foo()的定义移动到Vector3fP类时,它可以正常工作。但是,这在实际代码中是不可行的,因为FixedNP模板包含相当多的函数,这些函数应该从大约4个不同的类继承 在互联网上搜索之后,我发现添加 using FixedNP<3, float>::foo; 使用FixedNP::foo; 对于向量3FP,修复了某人的类似问题。但是,在我的

我很难弄明白如何使父类函数在C#中可见

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

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

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

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

using FixedNP<3, float>::foo;
使用FixedNP::foo;
对于向量3FP,修复了某人的类似问题。但是,在我的例子中,它只会导致另一个错误,这次是在编译C++/CLI代码时:

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


关于如何使我的函数在C#?

中可见的任何建议,我认为它们的关键在于以下几点:

如果模板未实例化,则它不会在元数据中发出。如果模板被实例化,元数据中将只显示引用的成员函数

这意味着C++代码中没有使用的函数不会在生成的DLL中使用,并且不能从C语言中使用这些函数。若要修复此问题,可以向C++代码中添加一个假函数,引用函数:

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

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

template ref class FixedNP<3, float>;
模板参考类FixedNP;

模板没有外部链接。不是C++,也不是C++ + CLI。您必须使用通用关键字。
int Dim
无法飞行。我知道,这就是我从模板继承“常规”类的原因之一。而且我很确定我不希望在这里使用泛型。首先,我希望在编译时完成这项工作,其次,我确实需要将参数设置为int,因为我以后会将其用作模板参数。好吧,根据MSDN,它们可以被管理:此外,当尝试混合本机代码和托管代码时,VS会告诉您。我刚刚找到了一个部分解决方案–如果我将virtual关键字添加到FixedNP::foo()中声明,它是有效的。不幸的是,这对静态函数没有用处。这是一个相当大的问题,因为FixedNP模板中的许多函数都是重载运算符…非常感谢,这很有帮助!不知何故,我在文档中遗漏了这一部分。我想这会迫使我创建一个合适的测试套件。你的答案很神奇。。。但由于某些原因,我尝试使用的函数“由于其保护级别而无法访问”,但它是public=[我已成功使用反射=]
using FixedNP<3, float>::foo;
void phony()
{
    auto vec = gcnew Vector3fP();
    vec->foo();
}
template ref class FixedNP<3, float>;