编程错误

关于结构体的声明

在文件开始部分的函数原型中,如果形参涉及结构体,那么此结构体应该在更前面的位置进行声明。

关于string类

string类位于名称空间std中,若在函数定义时形参涉及string类,应使用std::cout作为形参类型名,或在函数外对名称进行声明。当然,不要忘记与string类相关的头文件<string>。

关于读取访问权限冲突

可能的原因之一是使用了未正确初始化的指针变量。

关于重定义默认参数

在函数的声明与函数的定义中同时给出默认参数的值,将会导致重定义默认参数的错误。

函数声明:

函数定义:

关于声明不兼容

定义类的成员函数时,必须使用作用域解析运算符“::”。

关于const成员函数

const类型限定符仅用来修饰成员函数,表明调用该函数的对象不被修改。友元函数声明虽然在类声明中,但其并非成员函数,因此不允许使用const类型限定符。

关于重载<<运算符之一

重载<<运算符,当直接输出两个对象相加时,出现报错“没有与这些操作数匹配的<<运算符”。原因是两个对象相加返回值为临时对象,临时对象属于右值,不能绑定到左值引用。

需要使用常量左值引用或右值引用来绑定。

可将重载<<运算符函数:

改为:

也可建立临时变量存在两个对象的和并使用重载<<运算符函数输出:

关于重载<<运算符之二

在重载<<运算符时,若<<运算符函数返回值为ostream类而非ostream类的引用,出现报错“无法引用函数std::basic_ostream...--它是已删除的函数”,原因是使用了ostream的拷贝构造函数,该拷贝构造函数已经被删除(或是被禁用即无法调用,该拷贝构造函数只能被子类调用)。

Visual Studio中:

Qt中:

需要将<<运算符函数输出改为ostream类的引用ostream&:

关于Eclipse中Cannot run program...

在Eclipse中,运行程序产生错误“‘Launching ... Debug’ has encountered a problem.”:

原因在于工程的Launch Configuration设置存在问题,点击图中齿轮图标:

则弹出界面:

关于fatal error: Eigen/Core: No such file or directory

此时应点击Search Project...,并点击OK确定默认选项即可:

选择完成的结果如下:

若点击Browse...并在目录中选择工程源文件:

则会出现前面提到的错误。

若点开Search Project...后发现无可选项,则可编译程序一次后再进行设置。

关于报错:undefined reference to 'pthread_create'

在Eclipse中编译使用多线程的程序,报错undefined reference to 'pthread_create':

此种情况需要添加pthread库,但需要注意pthread库与其他使用pthread的库之间的相对顺序,pthread库需要在使用pthread的库的下方添加,方可保证在连接库时先加载pthread库再加载使用pthread库。其根本原因为gcc再链接过程中,右侧的库会先于左侧的库加载,亦即库的加载顺序是从右向左的。

另外一种可行方式是在Command后添加 -pthread。

关于重定义

在头文件中使用#ifndef声明,可以避免头文件被同一源文件多次include,但无法防止头文件被多个源文件#include。若头文件中包含变量或函数的定义而非仅仅包含声明,则多个均包含此头文件的源文件进行到编译过程中的链接步骤时,将会产生重定义问题。因此,不应再头文件中包含定义。

关于fatal error: Eigen/Core: No such file or directory

在已安装eigen库的情况下仍出现上述错误,则需要建立软链接将eigen库的安装位置映射到/usr/include下,命令为:

sudo ln -s /usr/include/eigen3/Eigen /usr/include/Eigen

 关于ROS中msg的创建

当使用rosmsg show查看创建的msg时,可能出现如下错误:

当使用tab补齐命令时:

当输入完整命令时:

此时可排查软件包中package.xml中是否存在错误或内容缺失。

关于报错:passing 'const TransMatrix' as 'this' argument discards qualifiers

类成员函数Premultiply的形参为const引用,因此要求函数不对传入的实参进行修改,但在函数中传入的实参将作为this指针调用了另外一个成员函数Postmultiply,由于Premultiply可能会对调用它的实参进行修改,因此报错,解决该问题,需要将实参在函数内部调用的Postmultiply函数声明为const 成员函数,即在函数声明后加上const限定符。

关于警告:reference to local variable 'result' returned [-Wreturn-local-addr]

当类成员函数的返回值是在函数内部声明的时,函数返回类型若为引用,将导致此警告,因为函数调用结束会使引用的临时变量存储空间被释放,从而无法获得正确的返回值。

关于表达式“double a = 1/2”结果为0

字面值1和2均为int类型,即使将其赋给double类型a,其也为整型除法结果为0,所以应该使用double类型字面值常量1.0/2.0方可得到期待的结果0.5。

关于成员初始化列表

在成员初始化列表中,初始化的只能是类成员。如上面的Test类中,第一个构造函数,类成员为double m_[3],而作为数组名的m_亦为指向存储3个double类型数据的指针,因而第一个构造函数中无法对不是类成员的数组中元素赋值正确的写法是:

第二个构造函数也存在问题,不能进行赋值。

关于拷贝赋值运算符

 

 程序12行报错:

robot.cpp:12:15: error: object of type 'KDL::ChainFkSolverPos_recursive' cannot be assigned because its copy assignment operator is implicitly deleted
chainfksolverpos_recursive.hpp:48:22: note: copy assignment operator of 'ChainFkSolverPos_recursive' is implicitly deleted because field 'chain' is of reference type 'const KDL::Chain &'

意为拷贝赋值运算符被隐式删除,究其原因,在于此类中包含cosnt成员(至于为何包含const成员会导致拷贝赋值运算符被隐式删除需要进一步研究),如下所示:

 

改为如下方式实现:

Linux环境下MATLAB导入URDF文件出错

当在Linux环境下MATLAB中使用inportrobot函数导入urdf文件时,若urdf文件目录中使用表示当前登陆用户目录的~,会引起Java exception occurred:、java.io.FileNotFoundException:报错,应该将导入文件的目录改为诸如/home/your_user_name/robot.urdf的形式。

关于向函数中传递未初始化的指针

在函数外声明一个指针但未初始化,将此指针传入函数,会引发程序崩溃,因为函数按值传递,传递进的是一个指向未知内存的地址,函数中对这个未知内存地址进行操作,会引发错误。可行的解决办法是,将传入参数改为指针的指针,则在函数中可操作传入的指针本身而不是其值;或使用new声明已经指向确定的分配好的地址的指针,并将其按值传入函数。

posted @ 2019-08-27 16:17  溪嘉嘉  阅读(507)  评论(0编辑  收藏  举报