里面有 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::map
和 std::vector
。
首先,使用ARG_
模板参数的引用,例如CMap<int,int&, CArray<USER_NAME>, CArray<USER_NAME>&>
,因为CObject
的构造函数是私有的,其次-使用std::map
和std::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”?