簡體   English   中英

錯誤C2248:“ X :: operator =”:無法訪問在類“ X”中聲明的私有成員

[英]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() ,這要求元素同時為DefaultInsertableMoveInsertable 這是不合格的,因為構造函數本身僅需要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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM