我正在尝试实现std::map
的不区分大小写的版本。这是我到目前为止的内容。
struct NOCASECOMPARE_STRUCT
{
bool operator() (LPCTSTR psz1, LPCTSTR psz2) const
{
return _tcsicmp(psz1, psz2) < 0;
}
};
std::map<std::wstring, int, NOCASECOMPARE_STRUCT> m_IndexLookup;
IColumn* operator[](LPCTSTR pszColumn) const
{
auto it = m_IndexLookup.find((LPTSTR)pszColumn);
if (it != m_IndexLookup.end())
return m_pColumns[it->second];
ASSERT(FALSE);
return nullptr;
}
上面的代码产生编译错误。尽管几乎无法读取数百行STL编译错误,但Visual Studio确实选择了一条更有意义的消息来放入错误列表。
'bool NOCASECOMPARE_STRUCT :: operator()(LPCTSTR,LPCTSTR)const':无法将参数1从'const _Kty'转换为'LPCTSTR'同[_Kty =标准:: wstring的]
如果我更改compare方法的签名以接受std::wstring
参数,则可以解决此问题,但是参数2无法转换。我想我可以将签名更改为每个签名,但是希望使我的代码更具通用性。
问题:
为什么std::wstring
不能转换为LPCTSTR
(我正在使用Unicode构建)?
有没有不更改我的比较方法签名的解决方法?
您的比较运算符应包含两个const std :: wstrings,因为这是std :: map传递给它的内容。从中提取c_str()元素并进行比较
struct NOCASECOMPARE_STRUCT
{
bool operator() (const std::wstring& sz1, const std::wstring& sz2) const
{
const wchar* psz1 = sz1.c_str();
const wchar* psz2 = sz2.c_str();
return _tcsicmp(psz1, psz2) < 0;
}
};
您可以求助于一个衬板,但是以这种方式进行调试更容易。