C++ 命名空间 "hiding"出现在 Eclipse 解析器中

标签 c++ eclipse namespaces ide eclipse-cdt

最近我在做一个项目,使用 C++ 作为编程语言,Eclipse CDT 作为编程 IDE。项目中使用了“Chrono”库。

我试图通过将定义放在与 chrono 相同的命名空间(即“std::chrono”)中来为不同的时间尺度(如纳秒)定义“<<”流运算符。头文件(Test.hpp)的一小部分代码示例如下:

#include <chrono>
#include <iostream>

namespace test{ namespace chrono{
  typedef std::chrono::nanoseconds  nanoseconds;
}}

namespace std{ namespace chrono{
  inline std::ostream& operator<<(std::ostream& s, nanoseconds dur)
  {
     return s << dur.count() << "ns";
  }
}} 

以上代码连同项目的其他部分可以正确编译。然而,IDE,Eclipse CDT,一直提示“Type 'std::chrono::nanoseconds' could not be resolved”并且自动完成功能对命名空间“std: :计时”。看起来在这个头文件的“std::chrono”命名空间中添加新函数以某种方式从 Eclipse 的角度“隐藏”了其他内容。

问题是在 Eclipse CDT 中导致此类“错误”消息的原因是什么,或者这是我编程中的一个缺陷?如果您提供任何帮助或提示,我将不胜感激。

我还将代码复制粘贴到笔记本电脑上的 Xcode 中,没有出现 Eclipse CDT 中的错误消息。

附加信息:

我使用的操作系统是 Mac OS,因此 chrono 库与答案中提到的略有不同。 'chrono.hpp' 截图如下:

enter image description here

实际上,我的 CDT 可以毫无问题地找到命名空间“std::chrono::”中的成员。令我困惑的是当我在命名空间“std::chrono::”中添加/覆盖成员时 CDT 的行为。见以下图片:

重写命名空间中的成员函数时出现错误: Errors appear when I override a member function in the namespace

当我在命名空间上什么都不做时,错误不会出现: Errors do not appear when I do nothing on the namespace

关于如何解决这个问题有什么想法吗?

最佳答案

关于您的设置的假设

我相信您已经更改了build设置以使用 -std=c++0x 或类似的东西,因为 chrono 库需要它。

也许你是这样做的: c++ setting

chrono(头文件)的顶部有一点像这样:

#if __cplusplus < 201103L
# include <bits/c++0x_warning.h>
#else

这样一来,如果您没有足够新的 C++ 标准,就会出现编译错误。

现在的问题是用于生成突出显示和代码完成的 CDT 索引器不知道您正在使用 __cplusplus >= 201103L。您可以在下面的屏幕截图中看到这一点,因为 __cplusplus 是错误的值,所以大部分 chrono 都处于非事件状态。

此屏幕截图显示了不正确的值和 CDT 识别的错误:

chrono header disabled

如果你尝试完成代码,你也会得到错误的结果:

missing code complete

如何修复

要解决此问题,您需要告诉 CDT 您的项目使用的 GCC 设置不同于默认的 GCC 设置。即由于不同的标准 __cplusplus 尤其具有错误的值。

  1. 在项目属性中,选择 C/C++ General -> Preprocessor Includes,然后选择 Providers 选项卡。
  2. 选择 CDT GCC 内置编译器设置
  3. 取消选中 Use global provider shared between projects
  4. 按确定

下面是截图:

nonglobal GCC discovery settings

执行此操作后,您应该会看到 chrono 的非事件部分在编辑器中变得正确:

chrono

但是你的源文件可能仍然是错误的。然后您应该重建要更新的索引,右键单击项目,选择 Index -> Rebuild:

rebuild index

最后你的代码应该不能正常显示:

good highlighting

完整的代码应该也能正常工作!

code complete after

历史

这是CDT的右手和左手不一致的情况。从历史上看,我认为这样做的原因在于性能和权衡编译器/用户选项的每个可能变体的索引,以及在工作区中共享一些数据,这对于某些项目来说可能是错误的。

关于C++ 命名空间 "hiding"出现在 Eclipse 解析器中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33475411/

相关文章:

c++ - 运算符 "+"重载返回零数组

java - 如何在没有单元测试的情况下找到类?

java - 如何在我的项目(如 android 文档)中使用我的文档注释?

java - Metro & StreamBuffer 命名空间错误——我理解正确吗?

c++ - 使用 winsock 发送 POST 数据(并使用 PHP 服务器端脚本接收它们)

c++ - C++ 中枚举的获取和设置

具有不同成员的 C++ 结构 - 在运行时决定

eclipse - 在 openCv 中使用 calcCovarMatrix 时出错

Python 将字符串转换为命名空间

python - 如何使用 lxml 向属性添加 namespace 前缀(节点与其他 namespace 一起使用)?