我最近更新了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版,误报编译错误不再出现。所以毕竟这是一个软件错误。