我最近更新到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&lt;#0&gt; :: difference_type) 语义错误
std::string::substr(..)
无法识别:
std::string myString = "test";
myString.substr(0, 1);
无效的参数' 候选人是: 的std :: basic_string的,性病::分配器&GT; 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功能。
我当前的配置是这样的(如项目设置中所示 - &gt; C / C ++常规 - &gt;预处理器包含路径 - &gt;条目):
__cplusplus = 201103L
我也尝试了其他组合,但是这个组合给我的误报率最低。
索引器已启用项目特定设置。到目前为止,我还没有发现任何切换,导致错误消失。
有没有人遇到过这样的问题?它是我的路径和符号的配置问题还是Eclipse索引器中的错误?
答案 0 :(得分:1)
std::next(i);
不正确。当你使用
for (auto i : v)
{
std::next(i);
}
i
变为*(v.begin())
类型,代码中的int
为std::next
。 difference_type
需要一个迭代器,迭代器也必须提供for (auto i : v)
{
std::cout << i << " ";
}
类型。
基于范围的for循环的整个目的是不必担心通过容器前进。如果你想从矢量中打印出所有东西,你只需要使用
type
我知道这并没有解决你的其他错误,但它修复了第一个错误
答案 1 :(得分:1)
我将Eclipse CDT更新到版本8.8.1,并且不再显示误报编译错误。毕竟这是一个软件错误。