std::vector<std::vector<t>&gt;::end() rend() begin() etc. don&#39;t have members?

时间:2019-03-17 22:58:51

标签: c++ clion bazel

I write this

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

And IDE says there is no push_back. On top of that, there are no members at all, and have no idea why.

Includes:

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

No suggestions for members of std::reverse_iterator

P.S. Use Clion 2018.3 and Bazel

UPD: Just tried to build the project using CMake. It works! But what can be wrong with Bazel?

BUILD:

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

WORKSPACE is empty.

3 个答案:

答案 0 :(得分:2)

S。您有两个问题,而您所关心的并不完全清楚。

  1. CLion无法显示std::reverse_iterator<...>方法。

    不知道,您真的依赖于此吗? 您知道有documentation

  2. 无论end()还是rend()迭代器都是不可引用的,因此它们实际上并未指向任何东西。因此,即使您的迭代器指向的 type 具有此方法,也将调用它是非法的,因为那里没有对象。

您可以将元素附加到外部向量的最后一个条目上,例如

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

如果这就是您想要的。但是,最后提醒一下,end()rend()方法会返回可能无法取消引用的单端迭代器。不要那样做。

答案 1 :(得分:2)

因此,您正在使用CLion IDE和Bazel构建系统,并且C ++代码中没有自动完成功能。当您切换到CMake构建系统时,自动补全功能起作用。

the Bazel documentation,它们用于自动完成的CLion集成在 beta 中。点击only Java and Python are listed as supported languages(通过CLion部分下的链接)进入他们的IntelliJ文档。

因此,尚不支持。

您可以要求该项目的开发团队进行确认,以及有关Bazel for CLion中何时可能提供C ++支持的信息。

顺便说一句,您的代码中有一个错误:rbegin()在向量为空时不应该被取消引用。尽管希望该片段只是说明。

答案 2 :(得分:0)

  

将反向迭代器返回到反向端返回一个反向迭代器   指向第一个元素之前的理论元素   向量(被认为是其反向末端)。

     

vector :: rbegin和vector :: rend之间的范围包含所有   向量的元素(顺序相反)。

第一个元素之前的理论元素->不应取消引用。它没有指向元素。

我的猜测是您想做: v.back()->push_back({});

考虑到v不为空。例如,如果v.push_back({})为空,则应该这样做。


就IDE而言,应该是配置问题。我主要在Eclipse上工作,通常可以解决此问题:

  • 设置编译器设置以匹配cmake的设置(例如,默认情况下,C ++项目未启用c ++ 11,因此应确保其具有-std = c ++在IDE的编译器设置上为11)。

  • 重新扫描所有包含项。

通常,您可以尝试查看是否无法识别某些内容(例如,对vector关键字进行下划线)。当您按ctrl键并单击vector时,您会看到IDE使用的是哪个标头以及它使用的是哪个代码(可能有一些ifdef和一些未激活,例如__cppversion> = 201103L或类似的意思是IDE认为您没有使用C ++ 11编译器。