里面有 CArray 的 CMap

Posted

技术标签:

【中文标题】里面有 CArray 的 CMap【英文标题】:CMap with CArray Inside it 【发布时间】:2018-03-27 20:26:59 【问题描述】:

我有一个像这样的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:“CObject::CObject”:无法访问在“CObject”类中声明的私有成员

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

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

【问题讨论】:

提示:停止使用旧的 MFC 容器并使用 std 容器,例如 std::mapstd::vector 首先,使用ARG_ 模板参数的引用,例如CMap&lt;int,int&amp;, CArray&lt;USER_NAME&gt;, CArray&lt;USER_NAME&gt;&amp;&gt;,因为CObject 的构造函数是私有的,其次-使用std::mapstd::vector 【参考方案1】:

使用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;

【讨论】:

【参考方案2】:

但是,问问自己是否真的必须使用 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。

【讨论】:

以上是关于里面有 CArray 的 CMap的主要内容,如果未能解决你的问题,请参考以下文章

如何在 MFC 中创建“CArray<CArray<CString>>& results”?

CArray数组对象序列化问题

如何使用空 CArray 初始化 CArray<CClass*> 函数参数的默认值?

CArray 和内存预分配

用java实现的strstr函数的一些问题

PyTables 之外的 CArray 和 EArray 兼容性