最近,我正在开发一个项目,使用C++作为编程语言,Eclipse作为编程环境。“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一直抱怨"Type‘std::chrono::nanosec秒’无法解析“,自动完成功能对名称空间"std::chrono”中的任何成员变量/函数都说“没有默认建议”。看起来,将新函数添加到这个头文件中的"std::chrono“命名空间中,会从Eclipse的角度”隐藏“其他内容。
问题是,在Eclipse中导致这种“错误”消息的原因是什么,或者这是我编程中的一个缺陷?我很感谢你的任何帮助或暗示。
我还将代码复制到膝上型计算机上的Xcode中,没有像Eclipse那样的错误消息。
附加信息
我所使用的操作系统是Mac,因此时间库与答案中提到的稍有不同。“chrono.hpp”的截图如下:

实际上,我的CDT在名称空间‘std::chrono:’中没有找到成员的问题。让我困惑的是,当我在名称空间'std::chrono::‘中添加/重写成员时,CDT的行为。见以下图片:
当我重写命名空间中的成员函数时出现错误:

当我对命名空间不做任何操作时,错误不会出现:

知道如何解决这个问题吗?
发布于 2015-11-03 16:44:17
关于你的设置的假设
我相信您已经将构建设置更改为使用-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 -> Preprocessor Includes,然后选择Providers选项卡。CDT GCC Built-in Compiler SettingsUse global provider shared between projects下面是一个截图,它看起来是什么样子的:

一旦您这样做,您应该在编辑器中看到chrono的非活动部分变得正确:

但你的源文件可能还是错的。然后重新生成要更新的索引,右键单击项目,选择Index -> Rebuild。

最后,您的代码不应该正确显示:

而且完整的代码也应该是有效的!

历史
在这种情况下,CDT的右手和左手不一致。从历史上看,我认为原因在于性能和放弃索引编译器/用户选项的每一种可能的变体,而不是在工作空间中拥有一些可能对某些项目不合适的共享数据。
https://stackoverflow.com/questions/33475411
复制相似问题