Eclipse 索引器显示误报语义错误



我最近更新了Eclipse Mars.2(版本4.5.2),并将我的项目切换到C++11开发(是的,是时候了!)。

我已经设法将所有 Makefile 配置为正确构建(即没有明显的错误或警告),但 Eclipse 内置索引器报告了几个误报语义错误。并非所有它们都与C++11特定功能有关。

我指的是已经存在的线程 [1] 和 [2],它们较旧,没有为我带来任何真正的解决方案。

误报示例

std::next(..)不认识 - 但我对std::begin()std::end()没有问题:

std::vector<int> v;
for (auto i = std::begin(v); i != std::end(v); i++)
{
  std::next(i);
}

无效参数 ' 候选人是: #0 next(#0, std::iterator_traits<#0>::d ifference_type) 语义错误

std::string::substr(..)无法识别:

std::string myString = "test";
myString.substr(0, 1);

无效参数 ' 候选人是: std::basic_string,std::分配器> substr(?, ?) 语义错误

GoogleTest 的 ASSERT_EQ 宏无法识别(但是,其他断言有效!

std::string expValue = "test";
std::string actValue = "test";
ASSERT_EQ(expValue, actValue);

无法解析
函数"比较" 语义错误


我已经测试了各种项目设置,得出的结论是,它与 Eclipse 项目的"路径和符号"设置以及"预处理器包括路径、宏等"设置有关。特别是提供商的顺序对任何更改都高度敏感。

另一个问题是我有一个带有 gcc 4.4.4 编译器的旧系统(默认为 /usr/bin/gcc 年),并在/opt/...中安装了额外的 gcc 4.8.2,实际用于编译。这也意味着我有两组头文件,但只有一个包含 C++11 功能。

我目前的配置是这样的(如项目设置 -> C/C++ 常规 ->预处理器包括路径 -> 条目所示):

  • CDT 用户设置条目
    • GCC 4.8.2 的系统标头(被视为内置)
    • 预处理器宏__cplusplus = 201103L
  • CDT 托管生成设置条目
    • 自定义包含和库路径的路径
  • CDT GCC 构建输出解析器
  • CDT GCC 内置编译器设置
    • GCC 4.4.4 的不可更改系统标头
    • 本地包括

我也尝试过其他组合,但这个组合给我的误报错误量最低。


索引器已启用特定于项目的设置。到目前为止,我还没有找到任何使错误消失的开关。


有没有人也遇到过这样的问题?是路径和符号的配置问题,还是 Eclipse 索引器中的错误?

std::next(i);不正确

。 当您使用

for (auto i : v)
{
    std::next(i);
}

i成为代码中int *(v.begin())的类型。 std::next需要一个迭代器,并且该迭代器还必须提供difference_type类型。

基于远程的 for 循环的全部目的是不必担心通过容器前进。 如果你想打印出矢量中的所有内容,你只需要使用

for (auto i : v)
{
    std::cout << i << " ";
}

我知道这不能解决您的其他错误,但它可以解决第一个错误

我将Eclipse CDT更新到8.8.1版,误报编译错误不再出现。所以毕竟这是一个软件错误。

最新更新