【掲示板ご利用上の注意】

 ※題名は具体的に!
 ※学校の課題の丸投げ禁止!
 ※ソースの添付は「HTML変換ツール」で字下げ!
 ※返信の引用は最小限に!
 ※環境(OSとコンパイラ)や症状は具体的に詳しく!
 ※マルチポスト(多重投稿)は謹んで!

 詳しくはこちら



 本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール   掲示板2こちら


管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.19752

テンプレートの引数の取り扱い
投稿者---だん(2005/02/05 17:03:01)


プログラムで以下の場合について質問させてください。
また、以下プログラムはもとのプログラムが大きいので
わからない部分を抜粋したものです。。

01:template< class aaa = std::ofstream, int bbb = 32 >
02:class ccc
03:{
04:・・・
05:}
06:
07:std::ofstream ddd(・・・);
08:
09:ccc< std::ofstream,3 > eee(ddd) ;
10:
11:ccc< std::ofstream > fff(ddd) ;
12:
13:ccc<> ggg(ddd) ;

そこで質問なのですが

(1)1行目がわかりません
そもそもテンプレートというのは型を渡すものだと理解しています。
しかし、代入を行っているので、ちょっと理解できていません。

(2)9行目でcccクラスのインスタンスeeeを作成しようとしていますが、
(1)でも書いたようにテンプレートは型をわたすものだと理解しているので、
1つの引数(テンプレートの<>の中を引数と言うのかわかりませんが...)は
std::ofstreamクラスの型をわたしていると理解していますが、
(1)のようにテンプレートは代入しているので、やはり理解できません
2つ目の引数は数値3を渡そうとしてることがもっと理解できないのです。

(3)11行目でcccクラスのインスタンスfffを作成、
13行目でcccクラスのインスタンスgggを作成しようとしていますが、
テンプレートの引数の数が合わないのです。

参考文献を数冊読んでみたのですが、
テンプレートの引数の数が合わないことについては
ふれられていませんでした。

どうか皆様ご助力ください。



この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:テンプレートの引数の取り扱い 19753 とおりすがり 2005/02/05 17:21:29


No.19753

Re:テンプレートの引数の取り扱い
投稿者---とおりすがり(2005/02/05 17:21:29)


>01:template< class aaa = std::ofstream, int bbb = 32 >

上記はtypename引数のデフォルト指定で、クラス使用時の<>内に指定がなかった場合に、
自動的に=以下のtypenameとなります。
http://docs.sun.com/source/806-4838/Ch4.html

上記が全く想像出来ないとなると、C++の通常の関数のデフォルト引数も理解していない
のではないでしょうか。
std::vectorの質問もそうでしたが、正直、ネットやC++の本を読めば、一発でわかる内容です。
自分で調べる癖をつけないと逆に苦労すると思いますよ。聞くことだらけすぎて。

それから、型だけでなく、値も指定出来ます。
http://www.wakhok.ac.jp/~sumi/stl/template.html


この投稿にコメントする

削除パスワード

No.19755

Re:テンプレートの引数の取り扱い
投稿者---とおりすがり(2005/02/05 17:33:23)


ちなみに先程示したページは、「C++ テンプレートとは」でググれば、あっさり発見できます。

おまけで、templateを使って階乗の値を実行時ではなく、コンパイル時に計算してしまう
プログラムを載せておきます。(templateに値を指定する例)

template <int N>
class Factorial {
 public:
  enum { value = N * Factorial<N - 1>::value };
};

template <>
class Factorial<1> {
 public:
  enum { value = 1 };
};

int main(int, char**) {
  // 実行時にはenum定数
  std::cout << "5! = " << Factorial<5>::value << std::endl;
  std::cout << "10! = " << Factorial<10>::value << std::endl;

  return 0;
}



この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧