CMap与CArray在里面

时间:2018-03-27 20:27:00

标签: c++ visual-c++ mfc

我有一个typedef这样的结构:

typedef struct
{
    int id;
    CString name;
} USER_NAME;

CMap<int,int, CArray<USER_NAME>, CArray<USER_NAME>> * m_mUserNameMap;

在CPP文件中:

CArray<USER_NAME> sUName;
sUName.id = 10;
sUName.name = "Test it!!!";

m_mUserNameMap = new CMap<int,int, CArray<USER_NAME>, CArray<USER_NAME>>;

m_mUserNameMap->SetAt(1, sUName); 

我收到以下错误:

  

错误C2248:&#39; CObject :: CObject&#39; :无法访问类&#39; CObject&#39;

中声明的私有成员

不知道发生了什么!!欢迎任何帮助。

我尝试使m_mUserNameMap不是指针,并且在该行本身中给出了上述错误。

2 个答案:

答案 0 :(得分:6)

使用CMap要求值类型是可复制构造和可分配的,但这些操作被标记为CObject的私有 - 派生类,例如CArray。这就是你收到错误信息的原因。

您无法像尝试一样声明地图。你可以做的是将值类型作为指针。那么你将把数组的地址添加到地图中,而不是那些期望副本的数组本身。

CMap<int, int, CArray<USER_NAME> *, CArray<USER_NAME> *> *m_mUserNameMap;

但是,问问自己是否真的必须使用MFC容器,因为标准容器是不受这些限制影响的替代品。仅当MFC容器是明显的选择并且在GUI代码的上下文中完全有意义时才使用它们。否则依赖标准容器。

std::map<int, std::vector<USER_NAME>> *m_mUserNameMap;

答案 1 :(得分:0)

  

但是,问问自己是否真的必须使用MFC容器

我自己会说,是的。 MFC比标准库更受青睐。两个原因:

---一个例子: YouTube视频:C ++ Now 2018:Z。Laine“ Boost.Text:修复std :: string,并将Unicode添加到标准C ++(第1部分)” https://www.youtube.com/watch?v=944GjKxwMBo     --std :: string显然效率很低。而且,似乎标准库缺少专用的支持……如果他们动手修复它,他们会的。很像Linux世界中发生的事情。

---另一个原因: 论坛主题发布在www.cplusplus.com:         Linux开发人员威胁要取消“杀戮开关” http://www.cplusplus.com/forum/lounge/243067/    -虽然Linux不是标准库...它们都是开放源代码资源... IMO,太过舒适了。