我的分割功能无效,错误C2664,

问题描述

因此,这应该将字符串拆分并转换为列表:

std::list<std::string> strSplit(std::string::iterator begin,std::string::iterator end,char c) {
    while(std::find(begin,end,c) != end) *std::find(begin,c) = '\0';
    return std::list<std::string>(begin,end);
}

但是编译器会抛出此错误

Error: C2664    
'std::basic_string<char,std::char_traits<char>,std::allocator<char>>::basic_string
(const std::basic_string<char,std::allocator<char>> &)':
 cannot convert argument 1 from 'char' to 'std::initializer_list<_Elem>'

然后双击重定向到xmemory0行:881

...
template<class _Objty,class... _Types>
static void construct(_Alloc&,_Objty * const _Ptr,_Types&&... _Args)
{   // construct _Objty(_Types...) at _Ptr
::new (const_cast<void *>(static_cast<const volatile void *>(_Ptr)))
    _Objty(_STD forward<_Types>(_Args)...);
}
...

解决方法

您需要使用从"user.name" "company[0].name" 获得的返回迭代器,并实际从中创建一个std::find(和std::string迭代器)。将begin替换为c只会使原始字符串中包含\0,结果\0中的唯一字符串也将看起来像。

关于该主题-您可能应该为此使用std::list<std::string>,因为您可能不应该对原始字符串进行更改。

示例:

std::string::const_iterator
,

您的功能有多个问题。除了不编译。无论如何,它都会尝试将要尝试复制的字符串突变为列表,这没有任何意义。它还无缘无故地多次使用std::find,而不是存储其结果并重新使用它。这是我的版本:

std::list<std::string> strSplit(std::string::const_iterator const begin,std::string::const_iterator const end,char const c) {
  std::list<std::string> res;
  if (end != begin) {
    auto it = begin,prev = begin;
    while ((it = std::find(it,end,c)) != end) {
      res.emplace_back(prev,it);
      prev = ++it;
    }
    res.emplace_back(prev,end);
  }

  return res;
}