我试图做一个简单的地图来查找一些数据,但结果出来很奇怪:这是一个编译器错误?难道我做错了什么?
#include "stdafx.h"
#include "atlstr.h"
#include <map>
enum InputTypes { Manual, Automatic, Assisted, Imported, Offline };
struct Params
{
int inputType;
const char* moduleName;
DWORD flag;
};
int _tmain()
{
std::map<CString, Params> options {
{ "Add", { Manual, "RecordLib", 0 } },
{ "Open", { Assisted, "ViewLib", 1 } },
{ "Close", { Imported, "EditLib", 2 } },
{ "Inventory", { Automatic, "ControlLib", 3 } },
{ "Report", { Offline, "ReportLib", 4 } }
};
for (std::map<CString, Params>::iterator iter = options.begin(); iter != options.end(); ++iter)
{
printf("Entry: %s ==> { %d, %s, %d }\n", (const char*)(iter->first),
iter->second.inputType, iter->second.moduleName, iter->second.flag);
}
return 0;
}
输出:
Entry: îþîþîþîþîþîþîþîþîþîþîþîþ[â0; t ==> { 0, RecordLib, 0 }
Entry: Close ==> { 3, EditLib, 2 }
Entry: Inventory ==> { 1, ControlLib, 3 }
Entry: îþîþîþîþîþîþîþîþîþîþîþîþCâ0# t ==> { 2, ViewLib, 1 }
Entry: Report ==> { 4, ReportLib, 4 }
正如你所看到的,几个CString值转向垃圾。 但我看不出有什么理由不能以这种方式创建地图。
这是Microsoft Visual Studio 2013编译器中的一个错误吗?
我的代码有什么奇怪的东西,我错过了?
############编辑##############
对于那些谁认为这是一个问题CString
,与std::string
我重新写的,并且变得更糟输出:
#include "stdafx.h"
#include "atlstr.h"
#include <map>
enum InputTypes { Manual, Automatic, Assisted, Imported, Offline };
struct Params
{
int inputType;
std::string moduleName;
DWORD flag;
};
int _tmain(int argc, _TCHAR* argv[])
{
std::map<std::string, Params> options{
{ "Add", { Manual, "RecordLib", 0 } },
{ "Open", { Assisted, "ViewLib", 1 } },
{ "Close", { Imported, "EditLib", 2 } },
{ "Inventory", { Automatic, "ControlLib", 3 } },
{ "Report", { Offline, "ReportLib", 4 } }
};
for (std::map<std::string, Params>::iterator iter = options.begin(); iter != options.end(); ++iter)
{
printf("Entry: %s ==> { %d, %s, %d }\n", iter->first.c_str(),
iter->second.inputType, iter->second.moduleName.c_str(), iter->second.flag);
}
return 0;
}
输出
Entry: ==> { 0, , 0 }
Entry: Report ==> { 4, , 4 }
请注意,这确实可行IDEOne
您必须将'CString'对象明确地转换为'LPCTSTR'。尽管如此,最好尽快离开'CString'。 – Chad
@Chad,连同上个世纪的所有省略号废话:D – SergeyA
我已更新我的代码以进行明确的演员表演。但是,同样的问题依然存在。 – abelenky