0

以下のコード (vs2013) ブロックをビルドできず、「エラー C2248: 'Concurrency::critical_section::critical_section' : cannot access private member defined in class 'Concurrency::critical_section'」というエラーが表示される

なぜこれが起こっているのか、誰でも説明できますか?ありがとう

#include <ppl.h>

class Class1{

public: 

    concurrency::critical_section _cs;
    int f1;
    Class1(int f){ f1 = f; }
};

class Class2{

public: 
    std::vector<Class1> v1;
    Class2(){ v1.push_back(Class1(1)); v1.push_back(Class1(2)); }
};

int _tmain(int argc, _TCHAR* argv[])
{    
    Class2 c2();

    return 0;
}
4

1 に答える 1

2

concurrency::critical_sectionコピー可能でも移動可能でもありません(これは、コピーコンストラクターを作成する昔ながらの方法で行われたprivateため、エラーが発生します)。したがって、Class1書かれているように、コピーも移動もできずpush_back、ベクトルにすることもできません。

これを修正するには、コピーのみを行う独自のコピー コンストラクターとコピー代入演算子を記述しますf1

class Class1
{
public: 
        concurrency::critical_section _cs;
        int f1;
        Class1(int f) : f1(f) { }
        Class1(const Class1 &other) : f1(other.f1) { }
        Class1 & operator=(const Class1 &other) { 
            // synchronization omitted
            f1 = other.f1;
        }
};

補足:値で初期化されたオブジェクトではなく、 をClass2 c2();返す関数を宣言します。Class2

補足 2: VS の「エラー リスト」のエラー メッセージは、一般的に不完全です。完全なエラー ログについては、ビルド出力を確認する必要があります。この場合、VS2013 の完全なエラー ログは次のとおりです。

ConsoleApplication2.cpp(15): error C2248: 'Concurrency::critical_section::critical_section' : cannot access private member declared in class 'Concurrency::critical_section'
          D:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\concrt.h(3712) : see declaration of 'Concurrency::critical_section::critical_section'
          D:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\include\concrt.h(3549) : see declaration of 'Concurrency::critical_section'
          This diagnostic occurred in the compiler generated function 'Class1::Class1(const Class1 &)'
于 2014-08-21T09:15:46.283 に答える