2

std::threadクラスのVisualStudio2012の実装に問題があります。

Error C2248: "std::thread::thread": cannot access private member declared in class std::thread
    c:\program files (x86)\microsoft visual studio 11.0\vc\include\xmemory0 line: 606

A.hpp:

class A{ 
    public:
        A();
        ~A();


    private:
        vector<thread> listOfThreads;       
        int numberOfProcessorCores;
        int startUpWorkerThreads();
};

A.cpp:

    int A::startUpWorkerThreads(){
        if(numberOfProcessorCores <= 0) return 2; //Keine Angabe zur Anzahl der Prozessorkerne
        if(listOfThreads.size() > 0) return 3; //Bereits initialisiertdefiniert

        for(int i = 0; i < numberOfProcessorCores; i ++){
            thread newThread(&TaskManagement::TaskManager::queueWorker);            
            listOfThreads.push_back(newThread);
        }

        return 0;
    }

これは、スレッドクラスが使用される私のプログラムの一部です。

このエラーが発生する理由を誰かが知っていますか?

4

2 に答える 2

3

エラーは、操作がのコピーコンストラクターまたは代入演算子を呼び出そうとしていることを示していますstd::thread。これらは両方とも削除されているか、プライベートです。別の方法として、次のように一時的にプッシュすることで、スレッドをベクターに「移動」することができます。

listOfThreads.push_back(thread(&TaskManagement::TaskManager::queueWorker));

それ以外の場合は、スレッドオブジェクトを呼び出すことができstd::moveます。これにより、デフォルトで構築されたものと同じ状態のスレッドオブジェクトが残ります(コメントで指摘してくれた@JonathanWakelyに感謝します)。あなたの場合、スレッドを作成して明示的に移動する理由はありません。

于 2012-11-11T21:00:08.330 に答える
0

std::threadpush_back実行するために、そしておそらく他のvector操作のために必要なコピーコンストラクターがありません。

于 2012-11-11T20:55:32.373 に答える