Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使函数能够接受原始的poniter作为迭代器?_C++ - Fatal编程技术网

C++ 如何使函数能够接受原始的poniter作为迭代器?

C++ 如何使函数能够接受原始的poniter作为迭代器?,c++,C++,我有两个函数可以拆分字符串并将标记添加到vector中: template < typename InputIterator, typename ContainerType > void Slice(InputIterator begin, InputIterator end, typename InputIterator::value_type delimiter, ContainerType& contai

我有两个函数可以拆分字符串并将标记添加到vector中:

template < typename InputIterator, typename ContainerType >
void Slice(InputIterator begin,
           InputIterator end,
           typename InputIterator::value_type delimiter,
           ContainerType& container)
{
    using CharType = InputIterator::value_type;
    InputIterator right = begin;
    while (true) {
      begin = find_if_not(right, end, [ delimiter ](CharType c) { return c == delimiter; });
      if (begin == end) {
        break;
      } else {
        right = find_if(begin + 1, end, [ delimiter ](CharType c) { return c == delimiter; });
        container.push_back(std::basic_string< CharType >(begin, right));
      }
    }
}

template < typename InputIterator, typename ContainerType >
void Slice(InputIterator begin,
           InputIterator end,
           InputIterator delimitersBegin,
           InputIterator delimitersEnd,
           ContainerType& container)
{...}
错误包括(我使用MSVC2017和MSVC2013工具链):

错误C2780:“无效切片(InputIterator、InputIterator、InputIterator、InputIterator、ContainerType&)”:需要5个参数-提供4个参数

错误C2893:未能专门化函数模板的无效切片(InputIterator、InputIterator、InputIterator::value\u type、ContainerType&) 使用以下模板参数: '输入计算器=常量字符*' 'ContainerType=std::vectorstd::string,std::分配器'

更新:增加了功能体。 目前,最好不要使用其他特性,如std::span。 我希望得到以下字符串构造函数:

template< class InputIt >
basic_string( InputIt first, InputIt last, const Allocator& alloc = Allocator() );
template
基本字符串(先输入后输入,常量分配器&alloc=Allocator());
更新2:仍然不起作用,但出于不同的原因,我尝试更改分隔符类型:

 template < typename InputIterator, typename ContainerType >
  void Slice(
      InputIterator begin,
      InputIterator end,
      typename std::iterator_traits< InputIterator >::value_type delimiter,
      //typename InputIterator::value_type delimiter,
      ContainerType& container)
  {
    using CharType = typename std::iterator_traits< InputIterator >::value_type;
template
空片(
输入计算器开始,
输入端,
typename std::iterator\u traits::值\u类型分隔符,
//typename输入标识符::值\类型分隔符,
容器(类型和容器)
{
使用CharType=typename std::迭代器\u traits::值\u type;
现在它说:

错误C3861:'find_if_not':找不到标识符。请参阅对函数模板实例化'void StringUtils::Slice(InputIterator,InputIterator,char,ContainerType&')的引用,该函数模板实例化使用[\u Ty=std::string,InputIterator=char*,ContainerType=std::vectorstd::string,std::allocator]编译

而且:

错误C3861:“如果找到,则查找”:未找到标识符

你可以用一个小盒子

把它包在你的指针上。它轻巧又快速。
我不确定它是否已经在您的工具链中。

SFINAE开始生效。签名

template < typename InputIterator, typename ContainerType >
void Slice(InputIterator begin,
           InputIterator end,
           typename InputIterator::value_type delimiter,
           ContainerType& container)

原始指针是迭代器。问题似乎在于函数希望在最后传递一个容器。您传递的是原始指针和一个显然不匹配的
std::vector
。@super
函数需要一个容器……您传递的是一个显然不匹配的原始指针和一个std::vector。
我不知道这不是你的观点。向量不是一个容器吗?为什么它不匹配?@eerorika啊,对。我的错。它不应该是
typename std::iterator\u traits::value\u type delimiter,
,因为类型依赖于
InputIterator
?没有它就无法工作。@churill修复,谢谢。
 template < typename InputIterator, typename ContainerType >
  void Slice(
      InputIterator begin,
      InputIterator end,
      typename std::iterator_traits< InputIterator >::value_type delimiter,
      //typename InputIterator::value_type delimiter,
      ContainerType& container)
  {
    using CharType = typename std::iterator_traits< InputIterator >::value_type;
template < typename InputIterator, typename ContainerType >
void Slice(InputIterator begin,
           InputIterator end,
           typename InputIterator::value_type delimiter,
           ContainerType& container)
template < typename InputIterator, typename ContainerType >
void Slice(InputIterator begin,
           InputIterator end,
           typename std::iterator_traits<InputIterator>::value_type delimiter,
           ContainerType& container)