我正在嘗試使用G ++編譯一些C++代碼。它似乎在其他編譯器中工作正常,但由於某種原因,G ++不會產生工作輸出。G ++中的C++ - 不使用指針時出現分段錯誤
泄露:這是家庭作業的一部分,但我覺得它更像是一個編譯器問題,因爲它在其他編譯器中工作。
這裏是一個的肆虐的片段:
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 ++只是恨我,但後來我又可以做了愚蠢的事情。只需簡單地向正確的方向推動就會很棒。
'使用命名空間標準'結合命名您的類與標準庫名稱('set')相同的事情只能以眼淚結束。 – 2010-10-12 05:02:17
確切地說,'set'和'bag'的析構函數是做什麼的? (當在第一個代碼片段中創建一個對象時,該對象在其封閉的作用域塊的末尾被銷燬,當您像在第二個代碼片段中那樣動態地使用'new'創建一個對象時,該對象被銷燬當你「刪除」它。如果你從不「刪除」它,析構函數將永遠不會被調用;我猜測析構函數中的某些東西可能是你的問題的原因' psychic-debugging>')。 – 2010-10-12 05:04:23
@James:我將這個類重命名爲'discreet_set'。沒有效果。至於析構函數,它迭代一個鏈表並刪除每個節點的值。沒有什麼奇特的,但我會修補並讓你知道。非常感謝! – mattbasta 2010-10-12 05:19:21