Ошибка сборки Concurrency::critical_section: невозможно получить доступ к частному члену

Я не могу построить блоки ниже кода (vs2013) и получаю сообщение об ошибке "ошибка C2248: 'Concurrency::critical_section::critical_section': невозможно получить доступ к частному члену, объявленному в классе '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;
}

person Xin    schedule 21.08.2014    source источник
comment
Это сообщение об ошибке все, которое вы получаете? Измените свой вопрос, включив в него полный и неотредактированный журнал ошибок. Также укажите, пожалуйста, в какой строке кода ошибка.   -  person Some programmer dude    schedule 21.08.2014
comment
concurrency::critical_section нельзя скопировать.   -  person T.C.    schedule 21.08.2014
comment
Class2 c2(); не объявляет объект c2. Он объявляет его как функцию, возвращающую Class2   -  person Ajay    schedule 21.08.2014
comment
@Аджай. модифицирован до класса 2 с2; Спасибо. ошибка остается.   -  person Xin    schedule 21.08.2014
comment
@Joachim Pileborg да, это все, что у меня есть   -  person Xin    schedule 21.08.2014
comment
Я не ответил провайдеру, просто ошибка кодирования.   -  person Ajay    schedule 21.08.2014
comment
@Xin Для справки в будущем сообщения об ошибках в списке ошибок VS обычно неполные. Вы захотите проверить выходные данные сборки для полного сообщения.   -  person T.C.    schedule 21.08.2014


Ответы (1)


concurrency::critical_section не является ни копируемым, ни перемещаемым (это было сделано старомодным способом создания его конструктора копирования private, отсюда и ошибка, которую вы получаете). Следовательно, Class1 в том виде, в котором он написан, нельзя ни скопировать, ни переместить, и вы не можете push_back его 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 &)'
person T.C.    schedule 21.08.2014