1.编译器总是提示xtree文件中缺少一个定义。原因为命名空间没有结束的大括号。
2.在为easyDDA添加实时显示功能时,出现主窗口无图像且软件反应极慢的问题。原因为要显示的这幅图像中有几个数据未定义,使用的三维引擎openInventor。
3.QWidget 只能设置一个layout,并且设置之后,不能再设置其他的。
4.在使用cmake配置vs2010的项目时,出现类似“${VS2010}/VC/bin/cl.exe" is not able to compile a simple test program.”。解决办法:找到这个文件,设置为“以管理员身份运行”。
1.出现 类似“/usr/include/c++/4.8/ext/alloc_traits.h:199: error: no type named 'pointer' in 'class KBT_Tools::BaseVec<double, 3>'
typedef typename _Alloc::pointer pointer;"的错误。这是在linux下编译时出现的。g++的编译提示不如VC++,我出这个错误是因为把应该用std::map的地方用上std::vector. 在g++上出现错误,不能按vc++的习惯,在出错误那一行开始找解决办法,而要这个错误看不懂,看下一个错误,总有一个错误是能看懂的,这时就能解决问题。
2.在switch语句的case分支中新建对象时出现莫名其妙的错误。解决办法:把这一case分支用大括号括起来。
3.遇到类似 “error: undefined reference to `typeinfo for”的错误(使用g++编译)。某个类有virtual函数,但是没有定义对应的virtual虚函数。
4.使用模板类时,出现'undefined reference to void A<T,T1>::abc()'的错误。模板类在使用时会生成对应的新类,如vector<int>会在使用时生成一个新的vector类,其中的T替换为int。所以模板类的所有内容要在include时访问得到。 解决办法:将模板类cpp文件内的内容剪切到对应的.h文件内。
5.编译时出现‘undefined reference to vtable for "A::A"’,上网google了很久,都没有解决问题。最后仔细检查发现,这个类A有一个虚函数,我声明了但是没有定义。(这个提示真是。。。)
6. C++ 里面使用goto进行跳转的时候,如果使用不当,会出现“jump to label crosses initialization of...”这样的错误,出错的原因在于,某些类在未初始化的时候就程序就使用了goto,(换句话说,有些类是在goto语句出现之后才进行的初始化(执行构造函数)),这是不允许的。
解决办法:确认将必需的类初始化动作放到goto出现之前。(这里指的是类,不是普通的变量)
7.遇到类似“error: need ‘typename’ before ‘std::list<T>::iterator it ...”的错误,编译器没有识别出std::list<T>::iterator视作一个类型,所以这时需要告诉编译器。解决办法:按编译器说的,加个typename,变成 ”typename std::list<T>::iterator it ...“ 。
8.今天修改了qt的ui文件,把其中的qdoublespinbox的上下限设成了允许的最大值。结果软件的其他地方出了问题(具体表现为看不到显示的osg场景结点)。 汗。。。 之后把上下限设成了(-9999999~9999999)才正常。
9.比对两段代码结果,会多次写入。自己计算正确,但比对文件结果总是错。调试了很久,最后在每次输出的时候加上编号,发现输出的编号是倒序10的,仔细检查发现是因为文件指针开了没有关,导致结果后输出到文件由于回收资源先反而先写入了。。。
10.写代码时遇到bug
error: 'iterator_traits' in namespace 'ABC::boost::detail' does not name a typeerror出现5000多个,检查了好一阵,发现原因在于写模块类时,
.h文件 namespace ABC { template <class T> class A {...}; #include "A.txx" } .txx文件 #include <boost/exception/all.hpp> //这是在namespace ABC内include了boost文件 //定义模板类A的内容...
11.QT的信号和槽连接不上
有namespace ABC下的类sig,又有namespace BCD下的类A和B。连接类A的信号和B的槽。因为信号和槽在声明时参数列表都写的const ABC::Sig*。而我在connect时没有加命名空间ABC,导致无论如何也连不上。。。
解决办法:在connect时,给参数列表添加上命名空间ABC后一切正常。
clang (Mac平台下)
1.写了两个类关系,及调用如下:
class A //配合智能指针使用的计数基数 {}; class B: public A { virtual ~B();//类B的子类会有多态(使用virtual函数)特性 }; void f() { SmartPointer<B> b = new B; //SmartPointer<T>为实现的智能指针类 }编译没有问题,运行时,总提示我,pointer being deleted was not allocated。我检查了好久,最后发现,类A的虚构函数没有明确声明是虚的。。。,而我在A中判断计数为0的情况下,调用了delete this,这就出了这个错误。
这就是《Effective C++改善程序与设计的55个具体做法》(第3版)第4条款,写计数类就竟没想起来后面会有虚函数。汗。。。
2.类成员变量(std::string和std::vector等,非指针)调用时出错,运行时错误大致意思是使用被free的对象。
起初考虑成员变量占内存大导致溢出的问题,但这个对象很小。重新确定方向后,经过详细的debug发现,确实有被free的内容,但不是出错的这个变量,而是另一个变量。
这种问题与编译器有关。有的编译器会将类的成员变量包在一起,处理时方便。这是这个错误的原因所在。调用没出错变量时触及了另一个被free的变量。
3.一个完全没有头绪的bug内容如下:
/usr/local/include/boost/atomic/detail/storage_type.hpp:116:13: error: no type named 'uint128_type' in namespace 'ABC::boost'; did you mean '::boost::uint128_type'? typedef boost::uint128_type type; ^~~~~~~~~~~~~~~~~~~ ::boost::uint128_type经过详细检查,竟然是写宏时少了一个换行。。。
如下:
namespace XXX{ #define BCD(p)\ (p)*(p)\ } // 这行前必须还要有一个空行!!!