2012-05-08 52 views
1

假設我有一個用於創建樹或列表結構的類。讓我們把它在模板類的構造函數中使用malloc

template <typename K, typename V> 
class Node{ 
    // some data 
    Node<K,V>* next; 
    Node() { 
    next = static_cast<Node<K,V>*>(malloc(sizeof(Node<K,V>))); 
    } 
}; 

通過這樣做,我收到了以下編譯器錯誤:

there are no arguments to 'malloc' that depend on a template parameter, so a declaration of 'malloc' must be available (if you use '-fpermissive', G++ will accept your code, but allowing the use of an undeclared name is deprecated)

有沒有辦法使用malloc以這樣的方式,而不必使用過時的代碼?我想用malloc而不是新的,因爲我想在那裏做一些更高級的內存管理。

+2

這是一個不尋常的'Node'類。你有什麼似乎是自動分配下一個節點的鏈表節點,在正常情況下會導致無限遞歸,但實際上你正在使用'malloc',它不會調用你正在創建的對象的構造函數這會停止遞歸。我不確定這是否真的很聰明或真的不是。 –

+0

你確定你不是簡單地失蹤,包括cstdlib? (並說'std :: malloc'?) – Mat

+0

這聽起來像你不包括聲明malloc函數的stdlib.h。 –

回答

3

編譯器錯誤告訴你它沒有聲明malloc是什麼。您錯過了聲明該函數的include。

除此之外,該方法被打破。您正在編寫通用樹,但由於使用了malloc,因此您將限制使用POD類型(我假設KV存儲在Node中)。您應該使用new,而不是調用該類型的構造函數,而不僅僅分配內存。

+0

如果他使用'new',那麼他將導致無限遞歸。我不知道這是故意還是不是他用'malloc'。他可能會在某處放置'new',所以它不限於POD類型。 –

+0

@SethCarnegie:的確如此,但我認爲這是實現中的另一個bug ...... :)沒有明智的方式來實現帶有額外懸掛節點的列表,'malloc'不能保證內存將被初始化,這反過來意味着你不能區分列表中任何其他節點的* tail *,並且你不知道停止在節點鏈之後的位置。 –

+0

這是真的,但他可以刪除將其設置爲0的部分。哦,奇怪的問題。世界永遠不會知道。 –

8

看起來你好像缺少了#include <cstdlib>#include <stdlib.h>。編譯器抱怨缺少聲明。這些包含文件提供了一個。

相關問題