我想在STL地图中添加类对象作为C ++中的值。它就像std::map<CString,class myClass*>myMap
一样。但是编译器在执行此操作时向我显示错误。我是否应该为该类实现所有比较运算符重载?如果没有,那么我该如何实现呢?
代码如下:
//头文件
#pragma once
#include "afxsock.h"
#include"NetworkDataProcessor.h"
#include"MainFrm.h"
#include"ChattingDialog.h"
#include<map>
using namespace std;
class CConnectionManager :public CAsyncSocket
{
public:
static CConnectionManager *GetClientInstance();
BOOL ClientSignIn(CString, CString);
void ConnectToServer();
public:
CString m_sendBuffer;
int m_nBytesSent;
int m_nBytesBufferSize = MAX_BUFFER_SIZE;
virtual void OnClose(int nErrorCode);
virtual void OnConnect(int nErrorCode);
virtual void OnReceive(int nErrorCode);
virtual void OnSend(int nErrorCode);
public:
std::map<CString, CChattingDialog* >ChatWindows;
private:`enter code here`
CConnectionManager();
~CConnectionManager();
static CConnectionManager * client_instance;
};
// cpp文件功能:
void CMyMessangerView::OnClientListClick(NMHDR* pnmh, LRESULT* pResult)
{
DWORD dwPos = ::GetMessagePos();
CPoint point((int)LOWORD(dwPos), (int)HIWORD(dwPos));
GetListCtrl().ScreenToClient(&point); int nIndex; if ((nIndex = GetListCtrl().HitTest(point)) != -1)
{
CString string = GetListCtrl().GetItemText(nIndex, 0);
CChattingDialog chatingDlg;
chatingDlg.SendToUser = string;
CString user = chatingDlg.UserRealName(string);
CConnectionManager *client = CConnectionManager::GetClientInstance();
client->ChatWindows.insert(pair<CString, CChattingDialog *>(user, &chatingDlg));
UpdateData(FALSE);
chatingDlg.DoModal();
}
*pResult = 0;
}
错误: 15 IntelliSense:没有重载函数的实例&#34; std :: map&lt; _Kty,_Ty,_Pr,_Alloc&gt; :: insert [with _Kty = CString,_Ty = CChattingDialog *,_Pr = std :: less,_Alloc = std: :分配器&GT;]&#34;匹配参数列表 参数类型是:(std :: pair) 对象类型是:std :: map,std :: allocator&gt;
错误3错误C2976:&#39; std :: map&#39; :模板参数太少c:\ projects \ poc \ mymessanger \ mymessanger \ clientconnection.h 25 1 MyMessanger
错误4错误C2665:&#39; std :: pair :: pair&#39; :3个重载中没有一个可以转换所有参数类型c:\ projects \ poc \ mymessanger \ mymessanger \ mymessangerview.cpp 131 1 MyMessanger 16智能感知:没有构造函数的实例&#34; std :: pair&lt; _Ty1,_Ty2&gt; :: pair [with _Ty1 = CString,_Ty2 = CChattingDialog&amp;]&#34;匹配参数列表 参数类型为:(CString,CChattingDialog *)c:\ Projects \ POC \ MyMessanger \ MyMessanger \ MyMessangerView.cpp 131 29 MyMessanger 等...更多错误,如表示相同的
答案 0 :(得分:2)
你以错误的方式使用std :: map。您应该按如下方式重写代码:
client->ChatWindows[user] = &chatingDlg;
(如果你想使用map :: insert方法,你可以在这里阅读:http://www.cplusplus.com/reference/map/map/insert/。没有像你一样插入对,有一种方法可以返回一对interator / succes)。 / p>
但是,您还询问在类中需要实现什么才能将其存储在地图中而不是通过指针存储,而是按以下值存储:
std::map<CString, CChattingDialog> ChatWindows;
正确的答案是:你需要公共构造函数,复制构造函数,析构函数,辅助运算符和运算符&lt; (小于)在CChattingDialog类中,但不在类CConnectionManager中。 Map使用它们可以正确地存储,复制,删除和排序此类的元素。
答案 1 :(得分:2)
感谢大家回答此问题。谢谢Fomin Arseniy。 这个问题的解决方案是我在问题中猜到的,Fomin Arseniy在上面说过。 我们必须至少重载Copy构造函数并为我们将在map中使用的类指定运算符作为值。 首先,用户定义数据类型的映射声明必须类似于
std::map<CString, class CChattingDialog> ChatWindows;
而不是
std::map<CString, CChattingDialog> ChatWindows;
第二,我添加了两个函数
CChattingDialog& operator=(const CChattingDialog &s);
CChattingDialog(const CChattingDialog &s);
在CChattingDialog课程中。使用Fomin Arseniy建议的插入方法。
client->ChatWindows[user] = &chatingDlg;
成功编译了代码。
我们必须提供公共构造函数,复制构造函数,析构函数,辅助运算符和运算符&lt; (小于)如果需要在STL映射中添加用户定义的数据类型。