• ベストアンサー

templateの使い方を教えて下さい。

質問タイトルの通りです。 今、 unsigned char* AllocByteArray1d(unsigned long int n){ unsigned char *box; box = (uchar *)calloc(n, sizeof(uchar)); if(box == NULL){ puts("can't allocate memory..."); exit(1); } return box; } という関数があって、これはunsigned charの配列をとってくれる関数になってます。これをtemplateを使って、intの配列もとれるようにしたいんです。 恥ずかしながら試しに、 template <typename T> T* AllocByteArray1d(unsigned long int n){ T *box; box = (T *)calloc(n, sizeof(T)); if(box == NULL){ puts("can't allocate memory..."); exit(1); } return box; } とやってみましたがダメでした。事前にTのデータ型がわからないからだろうか、と思って template unsigned char* AllocByteArray1d(unsigned long int); を入れて実体化させてみましたが、これでもダメでした。 どこを修正すれば使えるようになるのか、C++に詳しい方に教えて頂けると幸いです。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

↓何の問題もありませんねぇ。 #include <cstdio> #include <cstdlib> template <typename T> T* AllocByteArray1d(unsigned long int n) {   T *box;   box = (T *)calloc(n, sizeof(T));   if ( box == NULL ) {    std::puts("can't allocate memory...");    std::exit(1);   }   return box; } int main() {   int* buffer = AllocByteArray1d<int>(100);   delete[] buffer; }

その他の回答 (4)

回答No.5

お疲れ様です。 <typename T>のTに対して、int等の型だけでなくクラスを指定する場合には、確保および開放にnewとdeleteを勧めます。 mallocおよびdeleteはメモリ確保・開放だけの処理ですので、Tにクラスを指定されてもコンストラクタ・デストラクタが動きません。 その点、new・deleteはメモリ確保・開放に加えてコンストラクタおよびデストラクタの起動を行ってくれます。

回答No.4

あーっ! 失礼しました free(buffer) が正解。

回答No.3

確か他人の回答への指摘はNGだったと思いますが、間違って覚えられると困りますので。。。 callocで確保するのであれば、開放はfreeです。 delete[]で開放するのであれば、確保はnewです。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

「ダメ」といわれても何がどう「ダメ」なのかわからないので, メッセージが出ているならそれを書いてください. 逆に, 他人に「ダメ」とだけ言われてあなたは何が「ダメ」なのか理解できますか? でもって, 「テンプレートパラメータが推論できない」というだけであれば, AllocByteArray1d<int>(なんか) のようにテンプレートパラメータを明示的に渡せばいいはずです. でも, こんなの普通は new か std::vector のどっちかを使うものだよなぁ.... なんでこんなことをしたいんだろう....

関連するQ&A