Я пытаюсь скомпилировать программу на C ++, которая использует std :: make_reverse_iterator, но получаю ошибку заголовка. В справочнике говорится, что функция действительно поддерживается начиная с C ++ 14, поэтому Я добавил флаг -std = c ++ 14, но все еще без кубиков. Я копаюсь некоторое время и не могу понять, почему это происходит. Любые идеи? Моя версия компилятора - g ++ 4.9.2

Вот простая программа (взята из приведенного выше ref), команды, используемые для скомпилируйте его и вывод программы.

Test.cpp :

#include <iostream>
#include <iterator>
#include <vector>
#include <algorithm>

int main() {
    auto v = std::vector<int>{ 1, 3, 10, 8, 22 };

    std::sort(v.begin(), v.end());
    std::copy(v.begin(), v.end(), std::ostream_iterator<int>(std::cout, ", "));

    std::cout << '\n';

    std::copy(
        std::make_reverse_iterator(v.end()), 
        std::make_reverse_iterator(v.begin()),
        std::ostream_iterator<int>(std::cout, ", "));
}

Составитель:

g++ -std=c++14 test.cpp -o test

Выход:

test.cpp: In function ‘int main()’:

test.cpp:15:9: error: ‘make_reverse_iterator’ is not a member of ‘std’
         std::make_reverse_iterator(v.end()), 
         ^

test.cpp:16:9: error: ‘make_reverse_iterator’ is not a member of ‘std’
         std::make_reverse_iterator(v.begin()),
2
PotatoBoy 3 Май 2018 в 20:55

1 ответ

Лучший ответ

make_reverse_iterator() был добавлен в результате LWG 2285 и не был добавлен в libsdtc ++ до декабря 2014 г.. Это в версии 5.1, и все там есть. 4.9.2 было слишком рано для этого. Так что если возможно, просто обновите.

Если это невозможно, вы можете добавить это самостоятельно, просто скопировав реализацию cppreference :

template< class Iterator >
std::reverse_iterator<Iterator> make_reverse_iterator(Iterator i)
{
    return std::reverse_iterator<Iterator>(i);
}
2
Barry 3 Май 2018 в 19:15