boostorg / algorithm

Boost.org algorithm module
http://boost.org/libs/algorithm
Boost Software License 1.0
114 stars 105 forks source link

algorithm/string -- find_all_regex() gives a compiler error when the result container is vector<iterator_range<string::iterator>> #87

Open Oshanath opened 3 years ago

Oshanath commented 3 years ago

The doc says that the container we should pass to this function can be std::vector<boost::iterator_range>. But when I run the program it gives a compile error. But when the result container passed, is a std::vector, everything works fine.

First code snippet is using std::vector<boost::iterator_range> as the result.

#include "boost/algorithm/string/split.hpp"
#include "boost/range/iterator_range_core.hpp"
#include <iostream>
#include <boost/algorithm/string.hpp>
#include <boost/algorithm/string/regex.hpp>
#include <vector>

int main(int, char**) {

    std::string s("Hello world");
    boost::regex regex("\\w");

    std::vector<boost::iterator_range<std::string::iterator>> result;
    boost::find_all_regex(result, s, regex);

}

Following is the last 3 lines of the compiler error. The whole error is too long.

c:\mingw\include\c++\9.2.0\bits\stl_iterator.h:787:11: note: no known conversion for argument 1 from 'gnu_cxx::__normal_iterator<const char*, std::cxx11::basic_string >' to 'const gnu_cxx::__normal_iterator<char*, std::cxx11::basic_string >&'

c:\mingw\include\c++\9.2.0\bits\stl_iterator.h:787:11: note: candidate: 'constexpr gnu_cxx::__normal_iterator<char*, std::cxx11::basic_string >::normal_iterator(__gnu_cxx::normal_iterator<char*, std::__cxx11::basic_string >&&)'

c:\mingw\include\c++\9.2.0\bits\stl_iterator.h:787:11: note: no known conversion for argument 1 from 'gnu_cxx::__normal_iterator<const char*, std::cxx11::basic_string >' to 'gnu_cxx::__normal_iterator<char*, std::cxx11::basic_string >&&'

Also I ran the same program in Clang compiler too. Still the same result.

But when I run the following program with the container as std::vector everything works without a hitch.

#include "boost/algorithm/string/split.hpp"
#include "boost/range/iterator_range_core.hpp"
#include <iostream>
#include <boost/algorithm/string.hpp>
#include <boost/algorithm/string/regex.hpp>
#include <string>
#include <vector>

int main(int, char**) {

    std::string s("Hello world");
    boost::regex regex("\\w");

    std::vector<std::string> result;
    boost::find_all_regex(result, s, regex);

}