0

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

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

和生产者类:

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

Producer的使用方式如下:

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

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

Producer被实例化并在这个 DLL 中提供了TSQueue<int>*时,编译和执行没有问题。

但是,当我尝试在另一个 C++/CLI dll 中使用TSQueue< int >*实例化Producer时,出现以下编译器错误:

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

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

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

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

4

3 回答 3

0

IMO,添加对 DLL 的引用是不够的,因为我们在这里处理的是“本机”模板而不是泛型。请确保您的其他DLL 具有#include指向TSQueue

于 2013-03-16T13:34:38.810 回答
0

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

于 2013-03-17T17:40:50.253 回答
0

正如汉斯·帕桑特悲伤的那样:

可以肯定的是,您在这里遇到了类型标识问题,这是由本机 C++ 模板跨越模块边界引起的。这通常是 C++ 中一个臭名昭著的问题,模板没有外部链接。使用泛型在 C++/CLI 中很容易解决,如果需要线程安全,您应该从 .NET Queue<> 类 ConcurrentQueue<> 中直接替换 TSQueue。

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

于 2013-04-16T08:00:29.450 回答