![](/img/trans.png)
[英]error C2248: 'point::x': cannot access private member declared in class 'point'
[英]error C2248: 'X::operator =' : cannot access private member declared in class 'X'
关于stackoverflow已经提出了类似的问题。 我确实看过它们,但仍然无法解决我面临的问题
我有一个结构X ,成员变量很少,包括互斥体 。 当从多个线程中推入其中的元素时,我正在使用此互斥锁来锁定对称为vecIds的成员向量的访问。
此外,由于我不希望X类型的对象可复制或可复制构造,因此我将复制构造函数和复制赋值运算符函数声明为私有
struct X
{
bool a;
unsigned value;
std::vector<unsigned> vecIds;
std::mutex mutex;
X(): a(false), value(0), mutex(){}
private:
X( X const &x);
X& operator=( Xconst &x);
};
在我的代码中的某个地方,我正在创建100个类型为X的对象的向量。在编译代码时,我看到以下错误:
C:\Program Files (x86)\Microsoft Visual Studio 11.0\VC\include\xutility(2466): error C2248: 'X::operator =' : cannot access private member declared in class 'X'
X.h(12): see declaration of 'X::operator ='
X.h(2): see declaration of 'X'
我似乎不知道问题出在哪里
这是VS2013中修复的VS2012错误。 VS2012的实现
explicit vector(size_type n);
调用resize()
,这要求元素同时为DefaultInsertable
和MoveInsertable
。 这是不合格的,因为构造函数本身仅需要DefaultInsertable
* 。 (更糟糕的是,其resize()
实现调用了erase()
,这要求类型为MoveAssignable
...。)
在此MSDN博客文章中提到了此问题 (搜索“ vector<DefaultConstructible>(10)
”)。
如果您使用固定长度的容器,请考虑使用std::array<X, 100>
。
*使用默认分配器时, *Insertable
需求基本上转换为*Constructible
。
您的代码在VS2013中可以正常编译,要快速解决问题,请尝试使用智能指针向量
#include <memory>
std::vector<std::unique<X>> x(100);
注意:您的结构X具有std :: mutex作为成员,互斥体不可复制或不可移动,这意味着X不可复制或不可移动。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.