ошибка: «make_reverse_iterator» не является участником «std» - PullRequest
0 голосов
/ 03 мая 2018

Я пытаюсь скомпилировать программу на 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()),

1 Ответ

0 голосов
/ 03 мая 2018

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);
}
...