我有线程安全队列的非托管模板类:
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的引用。
有谁知道如何克服这个问题。
答案 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;如果它需要是线程安全的。
但是泛型不能用于非托管类型,所以我使用的是特定于类型的非托管容器类。