我正在尝试使用G ++编译一些C ++代码。它似乎在其他编译器中工作正常,但无论出于何种原因,G ++都不会产生工作输出。
披露:这是家庭作业的一部分,但我觉得这更像是一个编译器问题,因为它适用于其他编译器。
这是造成严重破坏的片段:
set<int> t1, t2;
这很奇怪,因为下面的代码工作得很好:
set<int> *t1 = new set<int>();
set<int> *t2 = new set<int>();
当然,我必须使用->
代替.
,但这是预期的。第一个片段在运行时产生分段错误。第二个直观地表达了我的期望。
无论如何,在幕后,.cpp
set
有这个:
#include <cstdlib>
#include <iostream>
using namespace std;
template <class T>
set<T>::set() : bag<T>() {}
template <class T>
set<T>::set(const set<T>& b) : bag<T>(b) {}
.h
看起来像这样:
#include "bag.h"
template <class T>
class set : public bag<T>
{
public:
set( );
set(const set &b);
// ...
};
#include "set.cpp"
最后但并非最不重要的是,bag.cpp
和bag.h
文件如下所示:
using namespace std;
template <class T>
bag<T>::bag() {
head = NULL;
}
template <class T>
bag<T>::bag(const bag<T>& b) {
// ...
}
和bag.h
:
template <class T>
class bag
{
public:
bag( );
bag(const bag &b);
// ...
};
#include "bag.cpp"
同样,我觉得G ++只是讨厌我,但我又一次可能会做一些愚蠢的事情。只是在正确的方向上进行简单的推动就会很棒。
答案 0 :(得分:8)
这是一个普遍的提示,可以让你的生活更轻松一百万次。
使用“-g”和“-Wall”标志编译该程序:
gcc -g -Wall foo.cpp
“-g”添加调试信息。编译时,“-Wall”会发出其他警告。然后使用调试器:
gdb ./a.out
按运行启动程序。使用 bt 转储代码后的调用堆栈 崩溃。然后,您可以确切地看到代码中发生崩溃的位置。
当你在这里时,谷歌“gdb教程”。花一两个小时学习如何正确使用gdb将会带来兴趣。我保证你。