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

Я не могу построить ниже блоков кода (vs2013) и получить ошибку «Ошибка C2248:« Параллельность :: критическое_сечение :: критическое_сечение »: невозможно получить доступ к закрытому члену, объявленному в классе« Параллелизм :: критическое_сечение »»

Кто-нибудь может помочь объяснить, почему это происходит? Спасибо

#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;
}

0

Решение

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 &)'
2

Другие решения