C++ std::multimap编译错误
我第一次尝试使用multimap,但我的应用程序无法编译。蒂娅·保罗C++ std::multimap编译错误,c++,visual-studio-2008,mfc,C++,Visual Studio 2008,Mfc,我第一次尝试使用multimap,但我的应用程序无法编译。蒂娅·保罗 // file dept.h typedef std::multimap <CString, std::map< CString, CString> > _DeparmentRecord; // also tryied replacing CString with LPCWSTR _DeparmentRecord DeparmentRecord; // file dept.cpp DWORD
// file dept.h
typedef std::multimap <CString, std::map< CString, CString> > _DeparmentRecord; // also tryied replacing CString with LPCWSTR
_DeparmentRecord DeparmentRecord;
// file dept.cpp
DWORD CIni::AddNameValue(LPCWSTR Section, LPCWSTR Name, LPCWSTR Value)
{
DeparmentRecord.insert(std::make_pair ( Section, std::make_pair(Name, Value)) ); <-- error here
}
//文件dept.h
typedef std::multimap>\u DeparmentRecord;//还尝试用LPCWSTR替换CString
_deparcentrecord deparcentrecord;
//档案部
DWORD CIni::AddNameValue(LPCWSTR节,LPCWSTR名称,LPCWSTR值)
{
插入(std::make_pair(节,std::make_pair(名称,值));带有
1> [
1> _Kty=CString,
1> _Ty=CString
1> ]
1> 及
1> [
1> _Ty1=LPCWSTR,
1> _Ty2=LPCWSTR
1> ]
1> 及
1> [
1> _Ty=CString
1> ]
1> 原因:无法从“const std::pair”转换为“const std::less”
1> 与
1> [
1> _Ty1=LPCWSTR,
1> _Ty2=LPCWSTR
1> ]
1> 及
1> [
1> _Ty=CString
1> ]
1> 没有可执行此转换的用户定义的转换运算符,或者无法调用该运算符
1> c:\dev\projects\migrator\jobbuilder\jobbuilder\ini.cpp(55):请参阅正在编译的函数模板实例化“std::pair::pair>(const std::pair>&)”
1> 与
1> [
1> _Ty1=常数CString,
1> _Ty2=std::map
1> ]
===============生成:0成功,1失败,0最新,0跳过==/p>您正在尝试将对
插入到采用对
的映射中。您正在尝试将对
插入采用对的映射中(名称、值)是一对…但它应该是一个映射
STL错误可能是一个真正的难题。使用最新版本的GCC会有所帮助,它的错误消息会有很大的改进,但我看到您使用的是MSVC,所以这对您没有多大帮助。std::make_pair(名称、值)是一对…但它应该是一个映射
STL错误可能是一个真正的难题。使用最新版本的GCC会有所帮助,它的错误消息会有很大的改进,但我发现您使用的是MSVC,所以这对您没有多大帮助。除了其他答案之外,std::make\u pair将返回std::pair。不要指望编译器为您执行从LPCWSTR到CString的转换。 除其他答案外,std::make_pair将返回一个std::pair。不要期望编译器为您执行从LPCWSTR到CString的转换。如下更改函数
DWORD AddNameValue(LPCWSTR Section, LPCWSTR Name, LPCWSTR Value)
{
std::map<CString, CString> aTemp;
aTemp.insert(std::make_pair (Name, Value));
DeparmentRecord.insert(std::make_pair (Section, aTemp)) ;
}
DWORD AddNameValue(LPCWSTR节,LPCWSTR名称,LPCWSTR值)
{
标准::map aTemp;
aTemp.insert(std::make_pair(名称、值));
脱臂中心线插入件(标准:制作双绞线(截面,aTemp));
}
如下更改功能
DWORD AddNameValue(LPCWSTR Section, LPCWSTR Name, LPCWSTR Value)
{
std::map<CString, CString> aTemp;
aTemp.insert(std::make_pair (Name, Value));
DeparmentRecord.insert(std::make_pair (Section, aTemp)) ;
}
DWORD AddNameValue(LPCWSTR节,LPCWSTR名称,LPCWSTR值)
{
标准::map aTemp;
aTemp.insert(std::make_pair(名称、值));
脱臂中心线插入件(标准:制作双绞线(截面,aTemp));
}
除了其他正确答案外,如果您使用\u DeparmentRecord
的value\u type
而不是make\u pair
,您将避免转换问题(并可能得到更好的错误消息)
DWORD AddNameValue(LPCWSTR Section, LPCWSTR Name, LPCWSTR Value)
{
_DeparmentRecord::iterator i =
DeparmentRecord.insert(_DeparmentRecord::value_type(Section, v)).first;
i->second[Name] = Value;
}
还有一个小问题:不要对非本地名称使用前导下划线-它们是为标准库保留的。除了其他正确答案外,还可以避免转换问题(并可能得到更好的错误消息)如果您使用\u DeparmentRecord
的值\u type
typedef,而不是make\u pair
DWORD AddNameValue(LPCWSTR Section, LPCWSTR Name, LPCWSTR Value)
{
_DeparmentRecord::iterator i =
DeparmentRecord.insert(_DeparmentRecord::value_type(Section, v)).first;
i->second[Name] = Value;
}
还有一个小问题:不要对非本地名称使用前导下划线-它们是为标准库保留的。你知道,使用最新的MSVC也有帮助。你知道,使用最新的MSVC也有帮助。注意:你将替换节的条目,而不是更新它。但是DepartmentRecord是一个多重映射。所以不会添加新条目吗?注意:您将替换节的条目,而不是更新它。但是DepartmentRecord是一个多重映射。因此不会添加新条目吗?