std :: vector <std :: vector <T>> :: end () rend () begin () и т.д. не имеет членов? - PullRequest
0 голосов
/ 18 марта 2019

Я пишу это

std::vector<std::vector<int>> v;
v.rbegin()->push_back({});

И IDE говорит, что нет push_back.Вдобавок ко всему, нет никаких участников, и они понятия не имеют, почему.

Включает в себя:

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

Нет предложений для членов std:: reverse_iterator

PS Используйте Clion 2018.3 и Bazel

UPD: Просто попытался собрать проект с использованием CMake.Оно работает!Но что может быть не так с Базелем?

BUILD:

cc_binary(
    name = "main",
    srcs = ["main.cpp"],
    data = ["open_text.txt"],
)

РАБОЧЕЕ МЕСТО пусто.

Ответы [ 3 ]

2 голосов
/ 18 марта 2019

Вздох. У вас есть пара проблем, и не совсем очевидно, что вас волнует.

  1. CLion не показывает std::reverse_iterator<...> методов.

    Понятия не имею, вы действительно зависите от этого? Знаете, есть документация .

  2. Ни итераторы end(), ни rend() в любом случае не могут быть разыменованы, поэтому они на самом деле не указывают на что-либо . Таким образом, даже если тип в ваших точках итератора имеет этот метод, вызывать его было бы недопустимо, потому что там нет объекта.

Вы можете добавить элемент к последней записи в вашем внешнем векторе, например

v.back().push_back({});

если ты этого хочешь. Но, как последнее напоминание, методы end() и rend() возвращают итераторы за концом, которые не могут быть разыменованы. Не делай этого.

2 голосов
/ 18 марта 2019

Итак, вы используете CLion IDE и систему сборки Bazel, и вы не получаете автозаполнения в своем коде C ++. Автозаполнение работает при переключении на систему сборки CMake.

В документации Bazel , их интеграция с CLion для автозаполнения находится в бета . При нажатии на их документы IntelliJ (по ссылке в разделе CLion) только Java и Python перечислены в качестве поддерживаемых языков .

Итак, это пока просто не поддерживается.

Вы можете запросить подтверждение у команды разработчиков этого проекта и информацию о том, когда может появиться поддержка C ++ в Bazel для CLion.

Кстати, в вашем коде есть ошибка: rbegin() не может быть разыменована, когда вектор пуст. Хотя, надеюсь, этот фрагмент был просто экспозицией.

0 голосов
/ 18 марта 2019

Возврат обратного итератора к обратному концу Возвращает обратный итератор указывая на теоретический элемент, предшествующий первому элементу в вектор (который считается его обратным концом).

Диапазон между vector :: rbegin и vector :: rend содержит все элементы вектора (в обратном порядке).

теоретический элемент, предшествующий первому -> На него нельзя ссылаться. Это не указывает на элемент.

Я предполагаю, что вы хотите сделать: v.back()->push_back({});

Это, учитывая, что v не пусто. Сначала вы должны сделать v.push_back({}), если он пуст в качестве примера.


Что касается IDE, это должно быть проблемой конфигурации. Я в основном работаю на Eclipse, там эта проблема обычно решается:

  • Установка параметров компилятора в соответствии с настройками вашего cmake (например, проекты C ++ по умолчанию не включают c ++ 11, поэтому вы должны убедиться, что он имеет -std = c ++ 11 в настройках компилятора IDE).

  • Повторное сканирование всех включений.

Обычно вы можете попытаться проверить, не распознано ли что-то (например, недопустимо использовать ключевое слово vector). И когда вы нажмете Ctrl + клик по вектору, вы увидите, какой заголовок использует IDE и какой код он использует (могут быть некоторые ifdef, а некоторые могут быть не активированы, например, __cppversion> = 201103L или что-то подобное означает IDE считает, что у вас нет компилятора C ++ 11).

...