无法访问类“CObject”中声明的私有成员?

class EventDataValue { public: enum Types { NONE, INT, STRING, DOUBLE, ULONG }; EventDataValue() { this->Type = NONE; } EventDataValue( const EventDataValue &s ) { this->Type = s.Type; if (this->Type == INT) this->i = si; else if (this->Type == STRING) this->s = ss; else if (this->Type == DOUBLE) this->d = sd; else if (this->Type == ULONG) this->ul = s.ul; } EventDataValue& operator=( const EventDataValue &s ) { this->Type = s.Type; if (this->Type == INT) this->i = si; else if (this->Type == STRING) this->s = ss; else if (this->Type == DOUBLE) this->d = sd; else if (this->Type == ULONG) this->ul = s.ul; return *this; } EventDataValue(int value) { this->Type = INT; this->i = value; } EventDataValue(CString &value) { this->Type = STRING; this->s = value; } EventDataValue(LPCTSTR value) { this->Type = STRING; this->s = CString(value); } EventDataValue(double value) { this->Type = DOUBLE; this->d = value; } EventDataValue(unsigned long value) { this->Type = ULONG; this->ul = value; } ~EventDataValue() { } operator int(void) const { return this->i; } operator CString(void) const { return this->s; } operator double(void) const { return this->d; } operator unsigned long(void) const { return this->ul; } Types Type; int i; CString s; double d; unsigned long ul; }; class EventData { public: EventData(CString strEventCode, CString &strSessionId, int nFlowId = 0) { this->Add(CString(_T("tp")), strEventCode); this->Add(CString(_T("ss")), strSessionId); this->Add(CString(_T("ts")), (int)std::time(0)); if (nFlowId != 0) this->Add(CString(_T("fl")), nFlowId); } template <typename T> void Add(CString name, T value) { EventDataValue event_value(value); if (cMap.Lookup(name, NULL) == TRUE) return; cMap[name] = value; } CMap<CString, CString, EventDataValue, EventDataValue> cMap; }; class Events { public: Events() { } ~Events() { } void Add(EventData ev) { this->aEvents.Add(ev); } CStringW Serialize() { CStringW strOutput; INT_PTR i, j; if (_tcscmp(API_FORMAT, FORMAT_JSON) == 0) { for (i = 0; i != this->aEvents.GetCount(); i++) { EventData ev = this->aEvents[i]; strOutput += L"{"; j = 0; POSITION pos = ev.cMap.GetStartPosition(); while (pos != NULL) { CString key; EventDataValue value; ev.cMap.GetNextAssoc( pos, key, value ); strOutput += StringFormat(_T("\"%s\": "), key.GetString()); if (value.Type == EventDataValue::STRING) { CString str = value; strOutput += Enquoute(str); } else if (value.Type == EventDataValue::INT) { int n = value; strOutput += StringFormat(_T("%d"), n); } else if (value.Type == EventDataValue::DOUBLE) { double d = value; strOutput += StringFormat(_T("%d"), static_cast<int>(d)); } else if (value.Type == EventDataValue::ULONG) { ULONG ul = value; strOutput += StringFormat(_T("%u"), ul); } if (j++ < ev.cMap.GetCount() - 1) strOutput += _T(","); } strOutput += _T("}"); } } else { for (i = 0; i != this->aEvents.GetCount(); i++) { EventData ev = this->aEvents[i]; strOutput += _T("<Event>"); j = 0; POSITION pos = ev.cMap.GetStartPosition(); while (pos != NULL) { CString key; EventDataValue value; ev.cMap.GetNextAssoc( pos, key, value ); strOutput += StringFormat(_T("<%s>"), key.GetString()); if (value.Type == EventDataValue::STRING) { CString str = value; strOutput += str; } else if (value.Type == EventDataValue::INT) { int n = value; strOutput += StringFormat(_T("%d"), n); } else if (value.Type == EventDataValue::DOUBLE) { double d = value; strOutput += StringFormat(_T("%d"), static_cast<int>(d)); } else if (value.Type == EventDataValue::ULONG) { ULONG ul = value; strOutput += StringFormat(_T("%u"), ul); } strOutput += StringFormat(_T("</%s>"), key.GetString()); } strOutput += _T("</Event>"); } } return strOutput; } CArray<EventData> aEvents; }; 

有人可以告诉我,为什么我得到以下错误,当我试图编译这个?

 1>c:\program files (x86)\microsoft visual studio 11.0\vc\atlmfc\include\afxtempl.h(1329): error C2248: 'CObject::CObject' : cannot access private member declared in class 'CObject' 1> c:\program files (x86)\microsoft visual studio 11.0\vc\atlmfc\include\afx.h(559) : see declaration of 'CObject::CObject' 1> c:\program files (x86)\microsoft visual studio 11.0\vc\atlmfc\include\afx.h(534) : see declaration of 'CObject' 1> This diagnostic occurred in the compiler generated function 'CMap<KEY,ARG_KEY,VALUE,ARG_VALUE>::CMap(const CMap<KEY,ARG_KEY,VALUE,ARG_VALUE> &)' 1> with 1> [ 1> KEY=CString, 1> ARG_KEY=CString, 1> VALUE=EventDataValue, 1> ARG_VALUE=EventDataValue 1> ] 

Solutions Collecting From Web of "无法访问类“CObject”中声明的私有成员?"

 void Add(EventData ev) { this->aEvents.Add(ev); } 

必须Add(EventData& ev) 。 您的EventData类没有非默认的拷贝构造函数或拷贝赋值操作符,并且有一个不可复制的成员( CMap )。 这使EventData不可复制。 所以你不能通过价值传递它,因为这将不得不复制,这是你不能做的,因为类是不可复制的。

CMap有默认的copy-ctor。 由于CMap是从CObject派生而来的,而CObject的副本C-tor是私人的,所以你会得到一个错误。

由于CStringCMapCArray不兼容,我使用了std::mapstd::vector ,而不是使用CMapCArray