错误C2248:'X :: operator =':无法访问类'X'中声明的私有成员

时间:2014-08-21 09:20:06

标签: c++ c++11 mutex

在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'

我似乎不知道问题在哪里

2 个答案:

答案 0 :(得分:2)

这是在VS2013中修复的VS2012错误。

的VS2012实施
explicit vector(size_type n);

调用resize(),要求该元素同时为DefaultInsertableMoveInsertable。这是不一致的,因为构造函数本身只需要DefaultInsertable * 。 (更糟糕的是,它的resize()实现调用了erase(),这要求类型为MoveAssignable ...)

this MSDN blog post中提及(搜索&#34; vector<DefaultConstructible>(10)&#34;)。

如果您使用的是固定长度的容器,请考虑使用std::array<X, 100>


* 使用默认分配器时,*Insertable要求基本上转换为*Constructible

答案 1 :(得分:0)

您的代码在VS2013中编译得很好,可以快速解决您的问题,尝试智能指针向量

#include <memory>

std::vector<std::unique<X>> x(100);

注意:你的struct X将std :: mutex作为成员,mutex不可复制也不可移动,这意味着X是不可复制的,也不是可移动的。