You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C++类中QP对象头文件声明与源文件初始化问题求助

ROS下ProxSuite QP对象初始化问题解析

问题根源分析

你遇到的三个错误,核心多为C++通用语法规则问题,仅第二个错误的触发和ProxSuite库的QP类设计相关,但本质仍遵循C++语法逻辑:

  1. 类内带括号初始化被误解析为函数声明
    直接在类内写proxsuite::proxqp::dense::QP<double> qp(dim, n_eq, n_in);时,触发了C的「最令人头疼的解析」规则——编译器会把该写法识别为返回QP<double>类型、名为qp、参数被当作类型名的成员函数声明,因此报“‘dim’ is not a type”错误。这是纯C语法问题,与ProxSuite无关。

  2. 无默认构造函数导致类默认构造被隐式删除
    ProxSuite的QP<double>类未提供无参默认构造函数,当你在头文件仅声明QP<double> qp;却不初始化时,编译器会尝试为WaypointController生成默认构造函数,但因qp无法被默认构造,编译器会隐式删除WaypointController的默认构造函数,进而报错。此处触发点是QP类的设计(不提供默认构造),但本质是C++「类成员必须正确初始化」的语法规则。

  3. extern不能用于类非静态成员
    C语法明确规定,extern存储类说明符不能用于类的非静态成员变量,因此在类成员前加extern会直接触发编译错误,这是纯C语法问题,与库无关。

成员初始化列表写法的正确性

你给出的写法存在变量名不匹配的笔误:初始化列表里写的是neq(7),但QP构造时用的是n_eq,会导致编译器找不到n_eq成员变量而报错。修正变量名后,写法完全正确:

public:
  WaypointController()
      : dim(14), n_eq(7), n_in(0), qp(dim, n_eq, n_in) 
  {
  }

这种方式通过成员初始化列表直接调用QP的带参构造函数完成初始化,完全符合C++语法规则,也避开了前面的所有问题。

内容的提问来源于stack exchange,提问作者QualsPassed

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.12 06:01:07