3

継承したいくつかのマネージ C++ コードを更新しようとしています。私は c++ をまったく知りませんが、1.1 の時代に ac# クラスを取り込んだので、.Net の使い方を見つけることができます。これまでのところ、ConcurrentQueue を使用してメイン スレッドからワーカー スレッドに作業を送信すると、良い結果が得られました。

fullQueue = gcnew ConcurrentQueue<int>();

..

fullQueue->Enqueue(someNumber);

次に、実際のオブジェクトを挿入して、ワーカーにより複雑な指示を送信できるようにしたいと思います。ただし、これは機能しません。

public ref class workUnit
{
    int ptrOffset;
    System::String^ outputPath;
    public:
        workUnit(int offset, System::String^ path)
        {
            ptrOffset=offset;
            outputPath=path;
        }
};    

..

ConcurrentQueue test = gcnew ConcurrentQueue<workUnit ^>();

私は得る:

'System::Collections::Concurrent::ConcurrentQueue' : use of class generic requires generic argument list

'System::Collections::Concurrent::ConcurrentQueue::ConcurrentQueue' : the function template cannot convert parameter 1 from type 'System::Collections::Concurrent::ConcurrentQueue<T> ^'

明らかに、オブジェクトがキューに挿入される方法について基本的なことが抜けています。私の頭の中では、後でインスタンス化できるクラス オブジェクトへの参照を保持するキューを作成していると思うので、CLR はどの参照型が入るかを知る必要があるだけですが、明らかにこれは正しくありません。私は何が欠けていますか?

4

1 に答える 1

1

あなたが何かを逃したようです:)

using namespace System::Collections::Concurrent;

ref class WorkUnit
{
};

int main()
{
    ConcurrentQueue<WorkUnit^>^ test = gcnew ConcurrentQueue<WorkUnit^>();
}

初期化式の両側でジェネリック型<WorkUnit^>を参照する必要があります。

于 2012-11-25T19:57:47.607 に答える