2011-10-14 35 views
1
#include "PQueue.h" 

struct arcT; 

struct coordT { 
    double x, y; 
}; 

struct nodeT { 
    string name; 
    coordT* coordinates; 
    PQueue<arcT *> outgoing_arcs; 
}; 

struct arcT { 
    nodeT* start, end; 
    int weight; 
}; 

int main(){ 
    nodeT* node = new nodeT; //gives error, there is no constructor 
} 

我的目的是在堆中創建一個新的nodeT。錯誤是:在結構體中使用'new'關鍵字在C++中

錯誤C2512:「NODET」:可用

+5

該代碼沒有任何問題 - 「coordT」有一個隱式生成的構造函數,它什麼都不做。你真的從該代碼中得到錯誤嗎?它究竟說什麼? –

+0

錯誤C2512:'nodeT':沒有適當的默認構造函數可用 – SegFault

+1

您有不同的問題。你提供的代碼編譯得很好(你是否聲明瞭任何構造函數?)你可以嘗試粘貼它到ideone或任何其他類似的頁面來驗證這一點。 –

回答

5

PQueue<arcT *>沒有適當的默認構造函數沒有合適的默認構造函數,所以不能由編譯器生成nodeT默認構造函數。可以爲PQueue<arcT *>創建適當的默認構造函數,或者爲nodeT添加一個用戶定義的默認構造函數,該構造函數適當地構造outgoing_arcs

4

如果問題中當前發佈的代碼是完全相同的副本,那麼此錯誤的唯一可能原因是PQueue<…>未定義默認構造函數,而是定義了另一個構造函數。

否則這段代碼會編譯。

更準確地說,因爲您沒有爲您的結構定義構造函數,所以C++會嘗試自動生成它們。儘管如此,它只能做到這一點,只要它的所有成員變量都是適當的默認可構造或可初始化的。 std::string有一個默認構造函數,並且作爲指針的coordT*可以被初始化。所以只有PQueue<…>仍然是罪魁禍首。

3

這可能不是你的問題,但你只宣佈此行ARCT一個指針: -

nodeT* start, end; 

你已經宣佈開始爲指針,並最終作爲實際NODET對象。這是你想要做的嗎?

+0

好抓!我從來沒有注意到... –

+0

不,這不是我想要做的,我希望他們兩個都是指針,你爲我節省了很多時間 – SegFault