Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.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#_Templates_C++ Cli - Fatal编程技术网

在模板化C+上从C#调用方法+/CLI基类

在模板化C+上从C#调用方法+/CLI基类,c#,templates,c++-cli,C#,Templates,C++ Cli,我在C++/CLI中有一个类a,它派生自模板基类B。 我有一些C#代码,它有一个A的实例,并想对其调用一个方法。 如果在A中实施该方法,则一切正常。如果在B中实现,事情会变得很奇怪 我编写了最简单的代码来演示我要做的事情: C++/CLI: 模板 B级公共参考文献 { 公众: 无效测试(){} }; 公共参考等级A:公共B { }; C#: A=新的A(); a、 Test(); 在这个测试代码中,对test()的调用没有编译(我得到:“没有包含“test”的定义”)。如果我修改它使其成

我在C++/CLI中有一个类a,它派生自模板基类B。 我有一些C#代码,它有一个A的实例,并想对其调用一个方法。 如果在A中实施该方法,则一切正常。如果在B中实现,事情会变得很奇怪

我编写了最简单的代码来演示我要做的事情:

C++/CLI:

模板
B级公共参考文献
{
公众:
无效测试(){}
};

公共参考等级A:公共B { };

C#:

A=新的A();
a、 Test();

在这个测试代码中,对
test()
的调用没有编译(我得到:“没有包含“test”的定义”)。如果我修改它使其成为
Test()
静态(并在A上调用它,而不是在实例上调用它),则会得到相同的结果。如果这就是故事的结局,我会向微软挥舞拳头,接受它

然而,在我的真实代码中,我的等价物
Test()
正在工作! 奇怪的是,它只在一种情况下起作用。如果我复制了我的工作方法,只是更改了名称,那么新方法将无法再次访问

为了排除从其他地方获取的命名,我尝试删除工作方法。正如预期的那样,代码现在无法生成


我猜我所看到的仍然是一个小故障,我所尝试做的是不被支持的。但由于我找不到任何引用它的引用,而且我看到的异常,我想知道我应该期待什么。< /P> < P>在普通C++中,模板类方法只在链接范围内实际使用时才被实例化。我怀疑C++ + CLI实现可能是等价的,如果没有在C++程序集中使用,就不能生成测试代码(./p>>p>)。编译混合程序集-C++/CLI时,编译器会遵循一些规则将本机函数导出到程序集外部并为它们输出元数据

其中之一是,除非明确指定,否则本机方法不会从程序集中公开。要明确指定要通过元数据公开的本机方法,可以使用
#pragma make_public(此处为您的类)

另一个是模板函数不能暴露在程序集之外。因此,在您的情况下,不能公开模板类

但在您的情况下,我几乎肯定您不需要模板类,而是一个可以导出的通用类

为什么需要模板?你理解模板和泛型的区别吗?一个是编译时单元,另一个是运行时单元

试用

generic<class T>
public ref class B
{
public:
  void Test(){}
};


public ref class A : public B<System::Int32>
{
};
通用
B级公共参考文献
{
公众:
无效测试(){}
};
公共参考等级A:公共B
{
};

这就是我喜欢stackoverflow的原因:-)这正是发生的事情。想想看,这是显而易见的。我现在可以解决这个问题了。谢谢你的快速回答。他的代码中没有本机方法。这两个类都是
ref
,所以所有代码都是管理的。谢谢你的评论,伊万。显然,这个例子并不能代表我试图用模板做什么。我在这里专门使用一个模板来获得编译时结果。我不能用泛型实现同样的效果。看来,我所需要的就是得到公认的答案。 A a = new A(); a.Test();
generic<class T>
public ref class B
{
public:
  void Test(){}
};


public ref class A : public B<System::Int32>
{
};