无法区分大小写的std :: map将std :: wstring转换为LPCTSTR

问题描述 投票:0回答:1

我正在尝试实现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无法转换。我想我可以将签名更改为每个签名,但是希望使我的代码更具通用性。

问题:

  1. 为什么std::wstring不能转换为LPCTSTR(我正在使用Unicode构建)?

  2. 有没有不更改我的比较方法签名的解决方法?

c++ stl stdmap
1个回答
0
投票

您的比较运算符应包含两个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;
}

};

您可以求助于一个衬板,但是以这种方式进行调试更容易。

© www.soinside.com 2019 - 2024. All rights reserved.