尝试找出在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);
1条答案
按热度按时间jk9hmnmh1#
在你的方法
auto ltrim(const std::basic_string<T> &str)
中,你通过const引用传入一个字符串,然后试图用erase
修改它。字符串参数不能是const
才能修改它。erase
的重载不接受const
字符串,这当然是有意义的。但是编译器错误消息本可以更清楚一些。您还可以将
if constexpr()
语句简化为: