将非托管模板类实例作为参数传递给不同的dll会导致编译失败

时间:2013-03-16 12:27:17

标签: c++ templates interop c++-cli

我有线程安全队列的非托管模板类:

    template<class T>
    public class TSQueue {...}

生产者类:

    public ref class Producer
    {
        Producer(TSQueue<int>* Q) {...}
    };

生产者按以下方式使用:

    Producer^ p = gcnew Producer(new TSQueue<int>());

两者都在一个C ++ / CLI DLL Producer.DLL中定义。

实例化生产者并提供 TSQueue&lt;在这个DLL中,int&gt; * ,编译和执行都没有问题。

但是,当我尝试使用 TSQueue&lt; 实例化生产者时int&gt; * 在另一个C ++ / CLI DLL中我遇到以下编译错误:

    Error   23  error C2664: 'Producer(TSQueue<int>*)' : cannot convert parameter 1 from 'TSQueue<T> *' to 'TSQueue<int> *'

好像编译器无法确定我为Producer构造函数提供的Q的类型。

我添加了对Producer.DLL的引用。

有谁知道如何克服这个问题。

3 个答案:

答案 0 :(得分:0)

IMO,添加对DLL的引用是不够的,因为我们在这里处理w /“native”模板而不是w / generics。 请确保您的其他 DLL对#include

的标题有TSQueue指令

答案 1 :(得分:0)

您需要在两个库中包含TSQueue的完整定义。不要让它成为界面的一部分只在内部使用它。如果它需要成为API的一部分,请遵循Hans Passant的建议:使其成为通用或更好的,使用适当的框架实现。

答案 2 :(得分:0)

汉斯帕斯特伤心地说:

  

请确保您在此处遇到类型标识问题,这是通过让本机C ++模板跨越模块边界来实现的。这通常是C ++中一个臭名昭着的问题,模板没有外部链接。通过使用泛型很容易在C ++ / CLI中解决,你应该从.NET Queue&lt;&gt;中获得TSQueue的直接替换。 class,ConcurrentQueue&lt;&gt;如果它需要是线程安全的。

但是泛型不能用于非托管类型,所以我使用的是特定于类型的非托管容器类。