std::vectorosg::Vec2 points_r = Math::createBezier2(std::vectorosg::Vec2{pointC_r_out_2, pointC_r_out,pointU_2});提示非常量引用的初始值必须是左值
时间: 2024-01-20 18:04:48 浏览: 62
如果您在代码中使用了 `std::vectorosg::Vec2{pointC_r_out_2, pointC_r_out,pointU_2}` 这样的语句,那么这个错误提示可能是因为您的 `std::vector<osg::Vec2>` 类型的变量 `points_r` 是一个非常量的引用,需要绑定到一个左值上。
解决方法可以是将右值转换为左值,就像这样:
```cpp
const std::vector<osg::Vec2> temp{pointC_r_out_2, pointC_r_out, pointU_2};
std::vector<osg::Vec2> points_r = Math::createBezier2(temp);
```
这里将右值 `{pointC_r_out_2, pointC_r_out, pointU_2}` 赋值给一个 `const` 左值 `temp`,然后将 `temp` 传递给 `Math::createBezier2()`,这样就可以避免这个错误了。
相关问题
std::vector<osg::Vec2> points_r = Math::createBezier2(std::vector<osg::Vec2>{pointC_r_out_2, pointC_r_out,pointU_2});提示非常量引用的初始值必须是左值
这个错误提示可能是因为 `std::vector<osg::Vec2>{pointC_r_out_2, pointC_r_out,pointU_2}` 这部分代码产生了一个右值,而 `Math::createBezier2()` 的参数是一个非常量的引用,需要绑定到一个左值上。
解决方法可以是将右值转换为左值,就像这样:
```cpp
const auto temp = std::vector<osg::Vec2>{pointC_r_out_2, pointC_r_out,pointU_2};
std::vector<osg::Vec2> points_r = Math::createBezier2(temp);
```
这里将右值 `{pointC_r_out_2, pointC_r_out,pointU_2}` 赋值给一个 `const` 左值 `temp`,然后将 `temp` 传递给 `Math::createBezier2()`,这样就可以避免这个错误了。
#include "prepare_ogm.hpp" namespace senior { namespace guardian { namespace prepare { std::string PrepareOgm::Name() { return "Prepare Ogm Element"; } void PrepareOgm::Initiate() {} void PrepareOgm::Process(data::DataFrame& his, data::DataFrame& cur) { if (cur.source_ogm_points_.is_invalid()) return; if (cur.source_visual_ogm_points_.is_valid()) { cur.source_ogm_points_.insert(cur.source_ogm_points_.end(), cur.source_visual_ogm_points_.begin(), cur.source_visual_ogm_points_.end()); } if (cur.source_higher_ogm_points_.is_valid()) { cur.source_ogm_points_.insert(cur.source_ogm_points_.end(), cur.source_higher_ogm_points_.begin(), cur.source_higher_ogm_points_.end()); } auto& predict_path = cur.monitor_data_.mutable_predict_path(); predict_path.GenerateBoundary(cur); cur.AABox2d_ = predict_path.vehicle_AABox2d_; // if (!his.monitor_data_.is_need_to_take_over()) { // LOG(INFO)<<"1"; cur.AABox2d_.SetWidth(cur.AABox2d_.width() + 1.0); cur.AABox2d_.SetLength(cur.AABox2d_.length() + 1.0); // } std::vector<math::Vec2d> corner_points_; cur.AABox2d_.GetAllCorners(&corner_points_); auto& polygon2d = predict_path.tractor_polygon2d_; math::Vec2d temp; VoxelGrid filter_; common::Time now = common::Time::Now(); for (auto& point : cur.source_ogm_points_) { temp.set_x(point.x()); temp.set_y(-point.y()); if (cur.AABox2d_.IsPointIn(temp)) { cur.AABB_ogm_points_.emplace_back(point); } } cur.guardian_diagnose_["Prepare_PrepareOgm_AABox_filter"] = std::to_string((common::Time::Now() - now).ToSecond() * 1000); now = common::Time::Now(); filter_.VoxelGrid_ApplyFilter( cur.AABB_ogm_points_, cur.ogm_points_, corner_points_, 0.1, 0.1, 0); cur.guardian_diagnose_["Prepare_PrepareOgm_VoxelGrid_ApplyFilter"] = std::to_string((common::Time::Now() - now).ToSecond() * 1000); cur.ogm_points_.set_stamp(cur.source_ogm_points_.stamp()); cur.ogm_points_.set_time(cur.source_ogm_points_.time()); cur.ogm_points_.set_delay_time(cur.source_ogm_points_.delay_time()); cur.ogm_points_.set_valid(); } } // namespace prepare } // namespace guardian } // namespace senior 改变为C语言程序
这段代码无法直接转换为C语言程序,因为涉及到了C++特有的语法和库。例如命名空间(namespace)、类(class)、std::string、std::vector、auto关键字、模板等等,这些在C语言中都没有对应的语法和库。
如果需要将这段代码改写成C语言程序,需要根据实际需求重新设计程序结构和数据结构,并使用C语言的语法和库重新实现功能。这个过程需要根据具体情况进行逐步转换和重构,不是简单的替换和删除操作。
阅读全文