error: ISO C++ forbids declaration of ‘EIGEN_DEFAULT_COPY_CONSTRUCTOR’ with no type [-fpermissive]

在ros:noetic-Ubuntu20.04环境下使用catkin_make编译quadruped-robot时报了一个很奇怪的小众错误,网上查不到类似情况,也无人在issuse下提问。

错误描述如下:

/usr/include/eigen3/Eigen/src/Geometry/Quaternion.h:187:48: error: ISO C++ forbids declaration of ‘EIGEN_DEFAULT_COPY_CONSTRUCTOR’ with no type [-fpermissive]
  187 |   EIGEN_DEFAULT_COPY_CONSTRUCTOR(QuaternionBase)
      |                                                ^
/usr/include/eigen3/Eigen/src/Geometry/Quaternion.h:187:48: error: expected ‘;’ at end of member declaration
  187 |   EIGEN_DEFAULT_COPY_CONSTRUCTOR(QuaternionBase)
      |                                                ^
      |                                                 ;
/usr/include/eigen3/Eigen/src/Geometry/Quaternion.h:188:64: error: ISO C++ forbids declaration of ‘EIGEN_DEFAULT_EMPTY_CONSTRUCTOR_AND_DESTRUCTOR’ with no type [-fpermissive]
  188 |   EIGEN_DEFAULT_EMPTY_CONSTRUCTOR_AND_DESTRUCTOR(QuaternionBase)
      |                                                                ^
/usr/include/eigen3/Eigen/src/Geometry/Quaternion.h:188:64: error: expected ‘;’ at end of member declaration
  188 |   EIGEN_DEFAULT_EMPTY_CONSTRUCTOR_AND_DESTRUCTOR(QuaternionBase)
      |                                                                ^
      |                                                                 ;

逐行排查quadruped/CMakeLists.txt文件,发现它在第33行有如下代码:

list(APPEND includePath "/usr/include/eigen3")

使用的是apt安装的eigen3库,而我使用源码重装过eigen3,可能产生了冲突,于是将路径改到源码安装的eigen3库下:

list(APPEND includePath "/usr/local/include/eigen3")

之后再使用catkin_make进行编译,则能编译通过。

### 错误原因分析 在C++中,“ISO C++ forbids declaration of 'FuncBTATempCtrl' with no type”的错误通常是因为函数或变量声明时未明确指定其类型所致。这种问题可能由以下几个方面引起: 1. **忘记指定返回类型** 如果在声明函数时忽略了返回类型,编译器无法推断出该函数应该返回什么类型的值,从而引发此错误[^1]。 2. **范围基于循环的语法问题** 类似于引用中的情况,如果使用了C++11之后引入的范围基循环(range-based for loop),而未启用相应的标准选项(如 `-std=c++11` 或更高版本),也会导致类似的错误[^2]。 3. **头文件保护机制缺失** 缺少预处理器指令(如 `#ifndef`, `#define`, 和 `#endif`)可能导致重复定义某些类或结构体,进而影响到后续代码解析过程中的正常工作流[^3]。 4. **其他可能性** 可能还存在诸如拼写错误、宏替换不当等问题造成最终呈现给编译系统的文本不符合预期格式要求等情况[^4]。 --- ### 修复方法详解 #### 方法一:确认并补充正确的返回类型 对于任何函数定义而言,都应当清楚地标明它的返回值种类是什么样的数据类型。即便是那些并不打算实际产出结果的操作也应该显式地将其设为 `void` 类型。例如下面这个简单的例子展示了如何修正这类基本疏漏之处: ```cpp // 原始错误代码片段 FuncBTATempCtrl(); // 修改后的正确版本 void FuncBTATempCtrl(); ``` #### 方法二:确保启用了适当的标准支持 如果你正在尝试运用一些较新的语言特性和库特性的话,请务必记得告知编译程序所期望使用的特定标准化级别。可以通过命令行参数的形式完成这一操作,比如GCC/G++环境下添加如下标志即可开启对C++11的支持: ```bash g++ -std=c++11 your_code_file.cpp -o output_executable_name ``` 当然也可以选择更新至更加现代化的标准版本,像C++14甚至C++17都是不错的选择。 #### 方法三:完善头文件防护措施 每一个单独创建出来的`.h` 文件都应该配备一套完整的条件编译控制逻辑来避免不必要的多重加载现象的发生。这里给出一个典型的模板样式供参考借鉴: ```cpp #ifndef FUNC_BTA_TEMP_CTRL_H #define FUNC_BTA_TEMP_CTRL_H class FuncBTATempCtrl { public: void someMethod(); }; #endif // FUNC_BTA_TEMP_CTRL_H ``` 以上示范有效地阻止了同一个单元被多次纳入项目构建流程之中所带来的干扰因素。 #### 方法四:仔细审查整个源码树状结构 最后但同样重要的是,全面细致地梳理一遍全部涉及的相关联部分也是非常关键的一个环节。有时候表面上看起来只是单一位置上的小小纰漏实际上背后隐藏着更为复杂的连锁反应链条等待我们去发现和理顺。 --- ### 结论 综合考虑上述各方面要点后可以得出结论说要彻底消除“ISO C++ forbids declaration...”这样的告警信息就需要从根源上去查找定位确切的问题所在点位并通过采取针对性强的有效办法逐一加以改进和完善直至完全满足现行有效的国际通用准则为止才行啊!
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值