最近,我正在开发一个项目,使用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;的截图如下:
实际上,我的CDT在命名空间中找不到成员#std :: chrono ::&#39;是没有问题的。让我感到困惑的是当我在命名空间中添加/覆盖成员时,CDT的行为&#39; std :: chrono ::&#39;。见下图:
关于如何解决这个问题的任何想法?
答案 0 :(得分:1)
我相信您已将构建设置更改为使用-std=c++0x
或类似于计时库所需的内容。
在chrono
(标题文件)的顶部,有一点像这样:
#if __cplusplus < 201103L
# include <bits/c++0x_warning.h>
#else
因此,如果您没有足够的新C ++标准,则会出现编译错误。
现在问题是用于生成突出显示的CDT索引器,并且代码完成不知道您正在使用__cplusplus >= 201103L
。您可以在以下屏幕截图中看到,大多数chrono
处于非活动状态,因为__cplusplus
的值不正确。
此屏幕截图显示了错误的值以及CDT识别的错误:
如果你尝试编码完成,你也会得到错误的东西:
要解决此问题,您需要告诉CDT您的项目使用的GCC设置与默认的GCC设置不同。即因为不同的标准__cplusplus
特别具有错误的价值。
C/C++ General
- &gt; Preprocessor Includes
,然后是Providers
标签。CDT GCC Built-in Compiler Settings
Use global provider shared between projects
以下是截图:
执行此操作后,您应该会看到chrono
的非活动部分在编辑器中变得正确:
但您的源文件可能仍然是错误的。然后,您应该重建要更新的索引,右键单击项目,选择Index
- &gt; Rebuild
:
最后,您的代码无法正常显示:
代码完成也应该正常工作!
这是CDT的右手和左手不同意的情况。从历史上看,我认为这样做的原因在于性能和折衷索引编译器/用户选项的每个可能变体,而不是在整个工作空间中有一些共享数据可能对某些项目是错误的。