我无法构建以下代码(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;
}
答案 0 :(得分: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 &)'