繁体   English   中英

std :: wstring无法与std :: map的[]运算符一起使用<const wchar_t*, const char*>

[英]std::wstring not working with the [] operator of std::map<const wchar_t*, const char*>

我有一个const std::map<const wchar_t*, const char*>在全局名称空间中。 看起来像这样:

.h文件

typedef std::map<const wchar_t*, const char*> ShaderMap;

const ShaderMap::value_type rawShaderData[] = {
    ShaderMap::value_type( L"BasicShader_Vertex", 
        "..."
    ),
);

const int ElementCount = 2; //Length of rawShaderData
extern ShaderMap ShaderProgramsMap;

.cpp文件

ShaderMap ShaderProgramsMap = ShaderMap( rawShaderData, rawShaderData + ElementCount );

我试图像这样在我的代码的其他地方访问它:

std::wstring shaderKey = std::wstring( name + L"_Vertex" );
...
pShaderData = ShaderProgramsMap[shaderKey.c_str()];

使用调试器, shaderKey为“ BasicShader_vertex”,而pShaderData为NULL。 std::wstring::c_str的值与const wchar_t*进行比较是否存在问题,还是代码中的其他地方?

std::wstring shaderKey1 = std::wstring( name + L"_Vertex" );
ShaderProgramsMap[shaderKey1.c_str()] = "Whatever";

std::wstring shaderKey2 = std::wstring( name + L"_Vertex" );
pShaderData = ShaderProgramsMap[shaderKey2.c_str()];

shaderKey1.c_str()返回的指针与shaderKey2.c_str() 它们是2个不同的字符串,它们都分配了自己的数据,并为您提供了指向该分配的指针。 它们碰巧存储了相同的数据,但是您只是在看指针。 如果要搜索并按字符串排序,请将该键设置为std::wstring ,而不是const wchar_t* 同样,该值也很可能应该是std::string ,而不是const char* ,但是我让您决定。

原始方法的另一个问题是,一旦shaderKey超出范围, shaderKey.c_str()返回的指针就会悬空。

在您的示例代码中,我实际上没有看到std :: map;我看到了一个std :: map <> :: value_type元素数组(即const char *)。

因此, const ShaderMap::value_type ShaderProgramsMap[] = { ... };

实际上是: std::pair<wchar_t const* const, char const*> const ShaderProgramsMap[] = { ... }

并且, pShaderData = ShaderProgramsMap[shaderKey.c_str()];

实际上是:

int nArrayIndex = int(shaderKey.c_str());
pShaderData = ShaderProgramsMap[nArrayIndex]; // actually an array, not a map

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM