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