c++ - 尽管其他 find 语句有效,但没有对 std::find() 的匹配调用,并且包括
问题描述
我正在为解析 XML 的学校项目编写函数。我已经包含了标头并成功编译了其他 std::find()s。
我已将问题缩小到特定函数,但它不会编译。
#include <iostream>
#include <iterator>
#include <string>
#include <cstring>
#include <sys/types.h>
#include <unistd.h>
#include <errno.h>
#include <vector>
#include <algorithm>
#include <ctype.h>
#include "XMLParser.hpp"
void parseEndTag(std::vector<char>& buffer, std::vector<char>& pc,int& depth)
{
//parse End Tag
std::vector<char>::iterator endpc = std::find(pc, buffer.end(), '>');
if (endpc == buffer.end())
std::exit(1);
--depth;
std::advance(pc, 2);
std::vector<char>::iterator pnameend = std::find_if(pc, buffer.end(), [] (char c) { return std::isspace(c) || c == '>' || c == '/'; });
if (pnameend == buffer.end())
std::exit(1);
const std::string qname(pc, pnameend);
const auto colonpos = qname.find(':');
const std::string prefix = colonpos != std::string::npos ? qname.substr(0, colonpos) : std::string("");
const std::string local_name = colonpos != std::string::npos ? qname.substr(colonpos + 1) : qname;
pc = std::next(endpc);
}
以下几行是罪魁祸首
std::vector<char>::iterator endpc = std::find(pc, buffer.end(), '>');
std::vector<char>::iterator pnameend = std::find_if(pc, buffer.end(), [] (char c) { return std::isspace(c) || c == '>' || c == '/'; });
但在其他函数中,同样的语句可以编译,例如......
void parseDeclaration(std::vector<char>& buffer, std::vector<char>::iterator& pc)
{
// parse XML declaration
std::vector<char>::iterator endpc = std::find(pc, buffer.end(), '>');
if (endpc == buffer.end())
std::exit(1);
pc = std::next(endpc);
pc = std::find_if_not(pc, buffer.end(), [] (char c) { return std::isspace(c); });
}
这是我为迭代器行获取的错误代码:
错误:没有匹配函数调用'find(std::vector&, std::vector::iterator, char)' std::vector::iterator endpc = std::find(pc, buffer.end(), ' >'); ^ 在 /usr/include/c++/7/bits/locale_facets.h 中包含的文件中:
/usr/include/c++/7/bits/streambuf_iterator.h:369:5: 注意:候选:模板类型名 __gnu_cxx::__enable_if::__value, std::istreambuf_iterator<_CharT> >::__type std::find(std ::istreambuf_iterator<_CharT>, std::istreambuf_iterator<_CharT>, const _CharT2&) find(istreambuf_iterator<_CharT> __first,
^~~~
/usr/include/c++/7/bits/streambuf_iterator.h:369:5: 注意:模板参数扣除/替换失败:
XMLParser.cpp:56:72:注意:'std::vector' 不是从 'std::istreambuf_iterator<_CharT>' std::vector::iterator endpc = std::find(pc, buffer.end() , '>');
^
在来自 /usr/include/c++/7/algorithm:62:0 的文件中,来自 XMLParser.cpp:10:
/usr/include/c++/7/bits/stl_algo.h:3899:5: 注意: 候选: 模板_IIter std::find(_IIter, _IIter, const _Tp&) find(_InputIterator __first, _InputIterator __last,
^~~~
/ usr/include/c++/7/bits/stl_algo.h:3899:5:注意:模板参数推导/替换失败:
XMLParser.cpp:56:72:注意:推断参数“_IIter”的冲突类型(“std::向量'和'__gnu_cxx::__normal_iterator >')
std::vector::iterator endpc = std::find(pc, buffer.end(), '>');
帮助将不胜感激,即使我和另一位学生单独工作时也会遇到同样的问题。
解决方案
以下几行是罪魁祸首
std::vector<char>& pc
但在其他函数中,同样的语句可以编译,例如......
std::vector<char>::iterator& pc
您看得出来差别吗?
错误消息在一开始也解释了这一点:
错误:没有匹配函数调用 'find( std::vector& , std::vector::iterator, char)'</p>
推荐阅读
- iis - 在 windows server 2016 上发布 PHP web
- python - 以编程方式将 GeoJSON 渲染到图像文件
- wordpress - Wordpress:漂亮的永久链接在 ubuntu 服务器中不起作用
- java - 如何验证输入的值是一种颜色
- vba - 将一组变量声明为另一个变量的函数
- javascript - JavaScript 多输入验证
- c++ - 使用模型中的图像提供程序公开多个 QImage
- ios - SDWebImage 没有快速下载图像 3.0
- google-apps-script - 谷歌表格电子邮件多单元格值
- jenkins - 如何在 Jenkins 中打印 shell 脚本的输出并解析其结果?