1. 程式人生 > >error C2248: 'CObject::operator =' : cannot access private member declared in class 'CObject'

error C2248: 'CObject::operator =' : cannot access private member declared in class 'CObject'

碰到這個棘手的問題,我知道這個MFC底層的錯誤,可我對底層知之剩少。昨天看了網上的資料,可看不懂,今天又看了同樣的東西,看明白了。

先看一段示例程式碼:

 1 #define C2248_SWITCH    0
 2 
 3 struct A
 4 {
 5     int a;
 6 };
 7 
 8 struct B
 9 {
10     CArray<A, A&> b;
11 #if C2248_SWITCH
12     const B& operator=(const B& rhs)
13     {
14         if(this != &rhs)
15
         {
16             b.RemoveAll();
17             b.Append(rhs.b);
18             b.FreeExtra();
19         }
20 
21         return *this;
22     }
23 #endif
24 };
25 
26 typedef CArray<B, B&> C;
27 
28 void test()
29 {
30     B b;
31     C c;
32     c.Add(b); // C2248, C2248_SWITCH is defined as 0.
33 }
34
 
編譯時產生如下資訊:
 1 Compiling
 2 CArrayTest.cpp
 3 c:\program files\microsoft visual studio 8\vc\atlmfc\include\afxtempl.h(272) : error C2248: 'CObject::operator =' : cannot access private member declared in class 'CObject'
 4         c:\program files\microsoft visual studio 8\vc\atlmfc\include\afx.h(559) : see declaration of 'CObject::operator ='
 5
         c:\program files\microsoft visual studio 8\vc\atlmfc\include\afx.h(529) : see declaration of 'CObject'
 6         This diagnostic occurred in the compiler generated function 'CArray<TYPE,ARG_TYPE> &CArray<TYPE,ARG_TYPE>::operator =(const CArray<TYPE,ARG_TYPE> &)'
 7         with
 8         [
 9             TYPE=A,
10             ARG_TYPE=A &
11         ] 從以上的編譯資訊line9, line10可以看出是struct B預設的operator=運算子函式(由編譯器自動產生)出現了問題。因為struct B有一個CArray<A, A&>的成員變數,而CArray<A, A&>類的operator=是private型別(它繼承自CObject::operator=,且被定義為private型別)。所以我們要在struct B中過載operator=運算子,且把它宣告為public型別(struct中的成員變數和成員函式預設就是public型別,所以不用顯式的指明public).
在本示例程式碼中,只需把C2248_SWITCH定義為1即可。 由本例可以看出,如果我們的類/結構體中有CArray(或CList等其他的派生自CObject類)的成員變數,我們最好新增上一個public型別的operator=運算賦過載函式。

來自:http://www.cppblog.com/hlong/archive/2007/11/20/37015.html