C++类中QP对象头文件声明与源文件初始化问题求助
问题根源分析
你遇到的三个错误,核心多为C++通用语法规则问题,仅第二个错误的触发和ProxSuite库的QP类设计相关,但本质仍遵循C++语法逻辑:
类内带括号初始化被误解析为函数声明
直接在类内写proxsuite::proxqp::dense::QP<double> qp(dim, n_eq, n_in);时,触发了C的「最令人头疼的解析」规则——编译器会把该写法识别为返回QP<double>类型、名为qp、参数被当作类型名的成员函数声明,因此报“‘dim’ is not a type”错误。这是纯C语法问题,与ProxSuite无关。无默认构造函数导致类默认构造被隐式删除
ProxSuite的QP<double>类未提供无参默认构造函数,当你在头文件仅声明QP<double> qp;却不初始化时,编译器会尝试为WaypointController生成默认构造函数,但因qp无法被默认构造,编译器会隐式删除WaypointController的默认构造函数,进而报错。此处触发点是QP类的设计(不提供默认构造),但本质是C++「类成员必须正确初始化」的语法规则。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

