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

时间:2015-11-02 10:25:21

标签: 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,一直在抱怨&#34;键入&#39; std :: chrono :: nanoseconds&#39;无法解决&#34;并且自动完成功能表示&#34;没有默认提议&#34;对于命名空间中的任何成员变量/函数&#34; std :: chrono&#34;。看起来像是将新函数添加到&#34; std :: chrono&#34;这个头文件中的命名空间以某种方式隐藏了#39; Eclipse的观点中的其他内容。

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

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

其他信息

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

enter image description here

实际上,我的CDT在命名空间中找不到成员#std :: chrono ::&#39;是没有问题的。让我感到困惑的是当我在命名空间中添加/覆盖成员时,CDT的行为&#39; std :: chrono ::&#39;。见下图:

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

当我对命名空间不执行任何操作时,不显示错误: Errors do not appear when I do nothing on the namespace

关于如何解决这个问题的任何想法?

1 个答案:

答案 0 :(得分:1)

关于您的设置的假设

我相信您已将构建设置更改为使用-std=c++0x或类似于计时库所需的内容。

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

chrono(标题文件)的顶部,有一点像这样:

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

因此,如果您没有足够的新C ++标准,则会出现编译错误。

现在问题是用于生成突出显示的CDT索引器,并且代码完成不知道您正在使用__cplusplus >= 201103L。您可以在以下屏幕截图中看到,大多数chrono处于非活动状态,因为__cplusplus的值不正确。

此屏幕截图显示了错误的值以及CDT识别的错误:

chrono header disabled

如果你尝试编码完成,你也会得到错误的东西:

missing code complete

如何解决

要解决此问题,您需要告诉CDT您的项目使用的GCC设置与默认的GCC设置不同。即因为不同的标准__cplusplus特别具有错误的价值。

  1. 在项目属性中,选择C/C++ General - &gt; Preprocessor Includes,然后是Providers标签。
  2. 选择CDT GCC Built-in Compiler Settings
  3. 取消选中Use global provider shared between projects
  4. 按OK
  5. 以下是截图:

    nonglobal GCC discovery settings

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

    chrono

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

    rebuild index

    最后,您的代码无法正常显示:

    good highlighting

    代码完成也应该正常工作!

    code complete after

    历史

    这是CDT的右手和左手不同意的情况。从历史上看,我认为这样做的原因在于性能和折衷索引编译器/用户选项的每个可能变体,而不是在整个工作空间中有一些共享数据可能对某些项目是错误的。