下面这段代码为啥编译会报错
class CUITreeCtrl : public CObject
{
DECLARE_SERIAL(CUITreeCtrl)
//predefine
struct ITEM{

CString strName;
CArray<ITEM> arSub;
};
//function
public:
CUITreeCtrl(void);
~CUITreeCtrl(void);
//control function
inline void AddItem(ITEM& it){m_arItems.Add(it);}protected://variable
protected:
CArray<ITEM> m_arItems;
};而如果把结构体item中的CArray<ITEM> arSub;改成CArray<ITEM>* parSub;就不会报错

解决方案 »

  1.   

    template < class TYPE, class ARG_TYPE = const TYPE& > 
    class CArray : 
       public CObject
    ----------
    CArray有两个参数
      

  2.   

        struct ITEM{
            
            CString strName;
            CArray<ITEM> arSub;
            };
    只能自含指针, 因为无法确定大小
      

  3.   

    struct ITEM{
        
      CString strName;
      CArray<ITEM> arSub;
      };不能嵌套自身(无法确定大小)。因为ITEM*(4个字节) 与ITem是两种不同类型,就可以了
      

  4.   

    我的ITEM没有使用类本身的对象,是CArray的对象。
    CArray 的sizeof跟模板类型无关,它是有个指针指向这个模板类型的数组
      

  5.   

    另外如果注释掉
     //control function
        inline void AddItem(ITEM& it){m_arItems.Add(it);}这个函数也不会报错
      

  6.   

    VS2010错误提示:
    error C2248: “CObject::operator =”: 无法访问 private 成员(在“CObject”类中声明)
    1>          d:\program files\microsoft visual studio 10.0\vc\atlmfc\include\afx.h(535) : 参见“CObject::operator =”的声明
    1>          d:\program files\microsoft visual studio 10.0\vc\atlmfc\include\afx.h(509) : 参见“CObject”的声明
    1>          此诊断出现在编译器生成的函数“CArray<TYPE> &CArray<TYPE>::operator =(const CArray<TYPE> &)”中
    1>          with
    1>          [
    1>              TYPE=CUITreeCtrl::ITEM
    1>          ]
      

  7.   

    没看懂ITEM到底是个什么数据结构
    CObject的赋值和拷贝构造都是private的,任何从CObject派生的类都不能直接赋值和拷贝构造,除非自己实现。
     AddItem(ITEM& it){m_arItems.Add(it);}虽然传了个引用,但是把it放到m_arItems里应该要用到拷贝构造吧,由于你没有实现,就调用默认的,这里拷贝的细节请参考effctive C++记得好像是第46条款把。