首页 > 解决方案 > 尽管其他 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(), '>');

帮助将不胜感激,即使我和另一位学生单独工作时也会遇到同样的问题。

标签: c++c++11std

解决方案


以下几行是罪魁祸首

std::vector<char>& pc

但在其他函数中,同样的语句可以编译,例如......

std::vector<char>::iterator& pc

您看得出来差别吗?

错误消息在一开始也解释了这一点:

错误:没有匹配函数调用 'find( std::vector& , std::vector::iterator, char)'</p>


推荐阅读