Нет соответствующего вызова std :: find (), хотя другие операторы find работают и включают <algorithm> - PullRequest
0 голосов
/ 20 сентября 2019

Я пишу функцию для синтаксического анализа XML школьного проекта.Я включил заголовок и успешно скомпилировал другие std :: find ().

Я сузил проблему до определенной функции, но она не скомпилируется.

#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:48:0, из /usr/include/c++/7/bits/basic_ios.h:37, из / usr / include / c ++ /7 / ios: 44, из / usr / include / c ++ / 7 / ostream: 38, из / usr / include / c ++ / 7 / iostream: 39, из XMLParser.cpp: 1:
/ usr / include / c ++/7/bits/streambuf_iterator.h:369:5: примечание: кандидат: имя типа шаблона __gnu_cxx :: __ enable_if :: __ value, std :: istreambuf_iterator <_CharT>> :: __ типа 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 / алгоритм: 62: 0, из XMLParser.cpp: 10:
/usr/include/c++/7/bits/stl_algo.h:3899:5: note: кандидат:шаблон _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 :: vector' и '__gnu_cxx :: __ normal_iterator>')
std :: vector :: iterator endpc = std :: find (pc, buffer.end (), '>');

Помощь будет принята с благодарностью, и у меня и другого студента будут проблемы дажеработая над этим отдельно.

1 Ответ

2 голосов
/ 20 сентября 2019

Следующие строки являются виновниками

std::vector<char>& pc

Но в других функциях точно такое же утверждение компилируется, например ...

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

Можете ли вы найтиРазница?

Сообщение об ошибке также объясняет это в самом начале:

ошибка: не найдена соответствующая функция для вызова 'find ( std :: vector & ,std :: vector :: iterator, char) '

...