Reputation: 1818
I want to add class object in STL map as a value in C++.It's like std::map<CString,class myClass*>myMap
. But compilers showing me error in doing this. Should I have to implement all comparison operators overloading for that class?? If not then how do I can achieve that?
Code is as follows:
// header file
#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 file function:
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;
}
ERRORS: 15 IntelliSense: no instance of overloaded function "std::map<_Kty, _Ty, _Pr, _Alloc>::insert [with _Kty=CString, _Ty=CChattingDialog *, _Pr=std::less, _Alloc=std::allocator>]" matches the argument list argument types are: (std::pair) object type is: std::map, std::allocator>
Error 3 error C2976: 'std::map' : too few template arguments c:\projects\poc\mymessanger\mymessanger\clientconnection.h 25 1 MyMessanger
Error 4 error C2665: 'std::pair::pair' : none of the 3 overloads could convert all the argument types c:\projects\poc\mymessanger\mymessanger\mymessangerview.cpp 131 1 MyMessanger 16 IntelliSense: no instance of constructor "std::pair<_Ty1, _Ty2>::pair [with _Ty1=CString, _Ty2=CChattingDialog &]" matches the argument list argument types are: (CString, CChattingDialog *) c:\Projects\POC\MyMessanger\MyMessanger\MyMessangerView.cpp 131 29 MyMessanger etc... few more errors like indicating the same
Upvotes: 1
Views: 8486
Reputation: 1818
Thanks everyone for responding to this problem. Thank you Fomin Arseniy. The solution to this problem is what I guessed in the question and Fomin Arseniy said above. We must have to overload at least Copy constructor and assigning operator for class we are going to use in map as a value. First ,map declaration for user defined data types needs to be like
std::map<CString, class CChattingDialog> ChatWindows;
instead of
std::map<CString, CChattingDialog> ChatWindows;
and second,I added two functions
CChattingDialog& operator=(const CChattingDialog &s);
CChattingDialog(const CChattingDialog &s);
in the class CChattingDialog . Used inserting method as advised by Fomin Arseniy.
client->ChatWindows[user] = &chatingDlg;
compiled the code successfully.
We must have to provide public constructor, copy constructor, desctructor, assining operator and operator< (less than) if need to add user defined data types in STL map.
Upvotes: 3
Reputation: 3336
You use std::map in wrong way. You should rewrite your code as follows:
client->ChatWindows[user] = &chatingDlg;
(If you want to use map::insert method you can read about it here: http://www.cplusplus.com/reference/map/map/insert/. There is no pair inserting as you do, there is one method that returns pair of interator/succes).
However, you also asked what do you need to implement in your class to store it in map not by pointer but by value as:
std::map<CString, CChattingDialog> ChatWindows;
Correct answer is: you need public constructor, copy constructor, desctructor, assining operator and operator< (less than) in class CChattingDialog but not in class CConnectionManager. Map uses them to have possibility to correctly store, copy, delete and sort elements of this class in it.
Upvotes: 2