windows 字符串修剪模板

2uluyalo  于 2023-02-05  发布在  Windows
关注(0)|答案(1)|浏览(135)

尝试找出在str.erase(....行引发的编译器错误

std::basic_string<char,std::char_traits<char>,std::allocator<char>>::erase': 4 overloads have no legal conversion for 'this' pointer
template <typename T> // Forward
T ltrim_copy(T s);

template <typename T>
auto ltrim(const std::basic_string<T> &str)
{
    if constexpr (std::is_same_v<std::basic_string<T>, std::basic_string<char>>)
    {
        if (InStr(str, "\n"s))
        {
            auto split = StrSplit(str, "\n"s);

            std::string str2;
            for (int i = 0; i < split.size(); i++)
                str2 += ltrim_copy(split[i]) + "\n";

            return str2;
        }

        str.erase(str.begin(), std::find_if(str.begin(), str.end(), [](unsigned char ch) {
            return !std::isspace(ch);
            })); //error here

    }
    else
    {
        if (InStr(str, L"\n"s))
        {
            auto split = StrSplit(str, L"\n"s);

            std::wstring str2;
            for (int i = 0; i < split.size(); i++)
                str2 += ltrim_copy(split[i]) + L"\n";

            return str2;
        }

        str.erase(str.begin(), std::find_if(str.begin(), str.end(), [](wchar_t ch) {
            return !std::iswspace(ch);
            }));
    }
}

template <typename T>
T ltrim_copy(T s)
{
    ltrim(s);
    return s;
}

我在Visual Studio 2019下编译它,并调用模板为:

std::string a = R"(
   abc
           hello)";

    std::wstring b = LR"(
  hello
 ABC)";

    auto test = ltrim(a);
    auto test2 = ltrim(b);
jk9hmnmh

jk9hmnmh1#

在你的方法auto ltrim(const std::basic_string<T> &str)中,你通过const引用传入一个字符串,然后试图用erase修改它。字符串参数不能是const才能修改它。
erase的重载不接受const字符串,这当然是有意义的。但是编译器错误消息本可以更清楚一些。
您还可以将if constexpr()语句简化为:

if constexpr(std::is_same_v<T, char>)

相关问题