最近我在做一个项目,使用 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' 截图如下:
实际上,我的 CDT 可以毫无问题地找到命名空间“std::chrono::”中的成员。令我困惑的是当我在命名空间“std::chrono::”中添加/覆盖成员时 CDT 的行为。见以下图片:
关于如何解决这个问题有什么想法吗?
最佳答案
关于您的设置的假设
我相信您已经更改了build设置以使用 -std=c++0x
或类似的东西,因为 chrono 库需要它。
在chrono
(头文件)的顶部有一点像这样:
#if __cplusplus < 201103L
# include <bits/c++0x_warning.h>
#else
这样一来,如果您没有足够新的 C++ 标准,就会出现编译错误。
现在的问题是用于生成突出显示和代码完成的 CDT 索引器不知道您正在使用 __cplusplus >= 201103L
。您可以在下面的屏幕截图中看到这一点,因为 __cplusplus
是错误的值,所以大部分 chrono
都处于非事件状态。
此屏幕截图显示了不正确的值和 CDT 识别的错误:
如果你尝试完成代码,你也会得到错误的结果:
如何修复
要解决此问题,您需要告诉 CDT 您的项目使用的 GCC 设置不同于默认的 GCC 设置。即由于不同的标准 __cplusplus
尤其具有错误的值。
- 在项目属性中,选择
C/C++ General
->Preprocessor Includes
,然后选择Providers
选项卡。 - 选择
CDT GCC 内置编译器设置
- 取消选中
Use global provider shared between projects
- 按确定
下面是截图:
执行此操作后,您应该会看到 chrono
的非事件部分在编辑器中变得正确:
但是你的源文件可能仍然是错误的。然后您应该重建要更新的索引,右键单击项目,选择 Index
-> Rebuild
:
最后你的代码应该不能正常显示:
完整的代码应该也能正常工作!
历史
这是CDT的右手和左手不一致的情况。从历史上看,我认为这样做的原因在于性能和权衡编译器/用户选项的每个可能变体的索引,以及在工作区中共享一些数据,这对于某些项目来说可能是错误的。
关于C++ 命名空间 "hiding"出现在 Eclipse 解析器中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33475411/