2012-05-08 12 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です。その関数を宣言するインクルードがありません。

それ以外の方法は壊れています。あなたは一般的なツリーを書いていますが、mallocの使用のために、使用をPODタイプに制限しています(私はKVNodeに格納されていると仮定しています)。代わりにメモリを割り当てるだけでなく、型のコンストラクタを呼び出すnewを使用する必要があります。

+0

もし彼が 'new'を使うなら、彼は無限の再帰を引き起こします。それが意図的であるかどうか、彼が 'malloc'を使ったのかどうかはわかりません。彼はPODタイプに限定されないので、どこかに配置 'new'を使うことができます。 –

+0

@SethCarnegie:真実ですが、実装の別のバグだと思います。:)最後に余分なノードがあるリストを実装する意味のある方法はありません。 'malloc'はメモリを保証しませんその結果、リスト内の他のノードから* tail *を区別することができず、ノードの連鎖の後にどこで停止するかについての手がかりがないことを意味します。 –

+0

それは本当ですが、彼はそれを0に設定する部分を削除する可能性があります。ああ、奇妙な質問です。世界は決して知らないでしょう。 –

8

#include <cstdlib>または#include <stdlib.h>が見つからないようです。コンパイラは、宣言が欠落していると不平を言っています。これらのインクルードファイルは1つを提供します。

関連する問題