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()
返回的指针不同。它们是两个不同的字符串,它们都分配了自己的数据,并为您提供了一个指向该分配的指针。它们碰巧存储了相同的数据,但您只查看指针。如果要按字符串搜索和排序,请将关键字设为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
- cppcheck在const std::string[]上引发警告
- 为什么 const std::p air<K,V>& 在 std::map 上基于范围的 for 循环不起作用?
- 如何在旧c++中初始化const-std向量
- 将带有unique_ptr的可变 lambda 传递给 const&std::function
- r语言 - C++ 类型为"const std ::?
- std::move a const std::vector in a lambda capture
- 无法从'const std::string [3]'转换为'std::string'
- test1.cpp:9:77:错误:对"(const std::normal_distribution) <double>(std::mt19937&)"的调用不匹配
- 创建一个 const std::vector ,其中包含另一个 const std::vector 和其他值
- 有效地初始化 const std::vector 类成员
- 在 C++17 中使用 const std::string& 参数有意义吗?
- 为什么 std::unordered_map 不能与 const std::string 键一起使用?
- 无法在"catch(const std::exception &ex)"中捕获 std::invalid_argument
- 错误:C2679 二进制"==":未找到采用类型 'const std::string' 的右侧操作数的运算符(或者没有可接受的转换)
- 如何初始化 const std::vector<MyClass>
- 使用计数"const std::shared_ptr<...>"可变吗?
- 变量参数列表 后面的'const std::string&'弄乱了堆栈
- C++错误:将"const umap_int {aka const std::unordered_map<int, int>}"作为"this"参数会丢弃限定符 [-permissive]
- 不存在从"const std::string"到"time_t"的合适转换功能
- 无法从'std::string'中推断出'const std::reverse_iterator<_RanIt> &'的模板参数