0

スレッド セーフ キュー用の管理されていないテンプレート クラスがあります。

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

そしてプロデューサークラス:

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

プロデューサーは次のように使用されます。

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

どちらも 1 つの 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> *'

あたかもコンパイラが Producer コンストラクタに提供する QI のタイプを判別できないかのように。

Producer.DLL への参照を追加しました。

この問題を克服する方法を知っている人はいますか。

4

3 に答える 3

0

TSQueueの完全な定義を両方のライブラリに含める必要があります。インターフェースの一部にしないでください。内部でのみ使用してください。APIの一部にする必要がある場合は、Hans Passantのアドバイスに従ってください。汎用にするか、適切なフレームワーク実装を使用してください。

于 2013-03-17T17:40:50.253 に答える
0

IMO、ジェネリックではなく「ネイティブ」テンプレートをここで扱っているため、DLL への参照を追加するだけでは不十分です。他のDLL#includeのヘッダーにディレクティブがあることを確認してください。TSQueue

于 2013-03-16T13:34:38.810 に答える