代码之家  ›  专栏  ›  技术社区  ›  philsquared

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

  •  0
  • philsquared  · 技术社区  · 15 年前

    我有一节课, ,在从模板基类派生的C++/CLI中, . 我有一些C代码有一个 并希望对其调用一个方法。 如果该方法是在 一切都很好。如果在 事情变得很奇怪。

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

    C++/CLI:

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

    公共引用类A:公共B<系统::Int32> { };

    C:

      A a = new A();
      a.Test();
    

    在这个测试代码中,调用 Test() 不编译(我得到:“不包含”test“的定义)。如果我将其修改为 测试() 静态(并调用它 而不是实例)。如果这是故事的结尾,我会向微软挥拳致意,并与之共处。

    然而,在我真正的代码中,我有相当于 测试() 工作! 奇怪的是,它只在一种情况下起作用。如果我复制了我的工作方法并且只更改了名称,那么新方法就不能再访问了。

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

    我猜我所看到的仍然是一个小问题,我所要做的是不被支持的。但是,由于我找不到任何可以排除这一点的参考资料,以及我所看到的异常情况,我想确定一下我应该期待什么。

    2 回复  |  直到 15 年前
        1
  •  2
  •   Steve Gilham    15 年前

    在普通C++中,模板类方法仅在链接范围内实际使用时才被实例化。我怀疑C++/CLI实现可能是等价的——如果没有在C++程序集中使用,则不生成测试()的代码。

        2
  •  -1
  •   Ivan Zlatanov    15 年前

    你的问题的答案其实很简单。编译混合程序集C++/CLI时,编译器遵循一些规则,以便在组件外导出本机函数并输出元数据。

    其中之一是,除非明确指定,否则本机方法不会从程序集中公开。要显式指定要通过元数据公开的本机方法,请使用 #pragma make_public( Your Class Here ) .

    另一个问题是模板函数不能从程序集中公开。所以在您的案例中,您不能公开模板类。

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

    为什么需要模板?您是否了解模板与常规模板之间的区别?一个是编译时单位,另一个是运行时。

    试用使用

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