在ros使用for auto报错

本文介绍在Robot Operating System (ROS)中使用forauto关键字遇到的常见问题,包括如何解决编译错误,以及如何在CMakeLists中添加C++11特性。通过实例演示了auto类型声明、范围for语句的用法,并强调了C++11新特性在现代ROS开发中的重要性。
摘要由CSDN通过智能技术生成

修改方法:

CMakeLists中添加c++11特性
如在CMakeLists文件中添加语句set(CMAKE_CXX_STANDARD 11)set(CMAKE_CXX_FLAGS “-std=c++11”)

auto类型说明符

常常需要将表达式的值赋给变量,为了解决声明变量时表达式的值未知的问题,引入了auto类型说明符。它可以根据初始值自动分析表达式所属类型:

// 由val1和val2相加的结果推断出item的类型
auto item = val1 + val2;
//声明同一种类型
auto i = 0, *p = &i;//正确:p是整形指针
//不能声明不同类型
auto sz = 0, pi = 3.14 //错误

范围for语句for auto

c++11引入了一种更简单的for语句,可遍历容器或序列的所有元素:

for (declaration: expression)
	statement

其中expression必须是一个序列,其拥有能返回迭代器begin和end成员;
declaration定义一个变量,序列中的每个元素都必须能转换成该变量的类型,通常使用auto。如果需要对序列中的元素执行操作,循环变量须声明成引用类型
每次迭代都会重新定义循环控制变量,并将其初始化为序列中的写一个值,之后执行statement。所有元素都处理完毕后循环中止。

vector<int> v = {0,1,2,3,4,5,6,7,8,9};
//范围变量须是引用类型,才能对元素执行写操作
for(auto &r : v) //对v中每一个元素
    r *= 2;//将v中每个元素翻倍

由于准备修改v中元素的值,因此将r声明成引用类型。此时在循环内给r赋值,即改变了r所绑定的元素的值。
范围for语句等价的传统for语句:

for (auto beg = v.begin(), end = v.end(); beg != end; ++beg) {
	auto &r = *beg;
	r *= 2;
}


1.由于范围for语句预存了容器end()的值,所以不能在范围for语句内添加(删除)序列中的元素,否则end函数的值可能会无效。
2.由于for auto是c++11新特性,所以在使用vscode时可能会报错,需要在配置文件或CMakeLists中添加c++11特性
如在CMakeLists文件中添加语句set(CMAKE_CXX_STANDARD 11)set(CMAKE_CXX_FLAGS “-std=c++11”)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jzian_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值