• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:template< > と : とは・・・?)

templateと:とは?

このQ&Aのポイント
  • C++におけるtemplateと:の意味とは?
  • template<class _WPARAM, class _LPARAM> CMessage(HWND h, UINT u, _WPARAM wp, _LPARAM lp) : hWnd(h), uMsg(u), wParam((WPARAM)wp), lParam((LPARAM)(lp)), bHandled(FALSE)の意味とは?
  • templateにつけたら何らかの効果がつくのか?

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

  • ベストアンサー
  • bleis
  • ベストアンサー率68% (11/16)
回答No.1

templateは型に依存しないクラス/関数を記述するための仕組みです。 例えば、 template <class T> T max(T a, T b) { return a < b ? b : a; } とすると、このmax関数は<さえ適用できればどんな型にでも使用することが出来ます。 :は、初期化リストで、templateとは関係ありません。 struct hoge {  int vala;  hoge(int a) : val(a) {} }; struct piyo {  int val;  piyo(int a) { val = a; } }; この2つのクラスのコンストラクタはコンストラクタ呼び出し時にaを設定するという意味では同じですが、上がvalを初期化しているのに対し、下はvalに代入しています。 この2つの違いは、 int a = 10; と int a; a = 10; の違いと同じです。

LongSecret
質問者

お礼

なるほど! ありがとうございます。 少々ややこしい分量の作業で確認してみました。 ある関数を返り値dobleにしておいて中身を次のようにし struct a{ double b; double d; a(){ b=1; d=2;} a(double c) : b(c), d(c*10) {} a(double c,double f) : b(c), d(f*7) {} }; struct e{ int b; int d; e() : b(2), d(3) {} e(int c){ b=c; d=c*10;} e(int c,int f) { b=c; d=f*7;} }; a A,AA(7),AAA(3.1,-5.0); e B,BB(5),BBB(0,4); return (/*ここでインスタンスを作った全ての構造体のbとd全てを足します*/); 返った値は、確かに正しく『136.1』でした。 ということは、「:」はこの場合「コンストラクタ特有のもの」という解釈で正解ですか? …ということは、bleisさんの hogeのvala は、valにaがくっついているのかな…?そういう宣言が何か出来るのか…?と、自分の知識を不安に思いましたが 実際にはごくシンプルで、些細なタイプミスという事で大丈夫でしょうか? templateはクラス/関数に対して使用可… …ならば 「構造体に対して」は、templateは使えない、のでしょうか? あと一つ あるクラスのヘッダにtemplate<>つきの関数を宣言し ソースに内容を書きます。 それを、別クラスのメンバにそのクラスを持たせて そのインスタンスからその関数を呼び出そうとすると 「外部参照が未解決です」 絡みのエラーが出てきて、ビルドが出来ません。 これはどのような場合に発生して、またどうすれば解決できるのでしょうか?

LongSecret
質問者

補足

私もタイプミスです(笑) "double"ですね。

その他の回答 (2)

  • bleis
  • ベストアンサー率68% (11/16)
回答No.3

> 正確には、「ソース」とはコンパイルの後覗かれる・・・というわけですか? > 対して「ビルド」は、一連の、全体ですよね? ソースファイルは、コンパイル段階でオブジェクトファイルというものに変換され、それらをリンクして実行ファイルを生成します。 この一連の動作を全て行うのがビルドです。 > そしてつまり > 実際に別クラスから関数呼び出しを実現しようとする場合は > template< > の型が絡む関数・クラスや構造体のメンバ、は、どうしても > このように > 内容含めすべてをヘッダファイルに書くべき、ということになるのでしょうか? そういうことになりますね。 templateの使い方については、Modern C++ Designという本が非常に技巧的な使い方をしており、参考になると思います。 Modern C++ DesignはC++ in-Depth SeriesというC++を深く理解するために非常にためになるシリーズの中の1つです。 ほかのC++ in-Depth Seriesも読んでみるといいかもしれません。 おすすめは、Exceptional C++とExceptional C++ Styleです。

LongSecret
質問者

お礼

確かに言われてみると、エラーの場所(?)がobjだった気がします。 それらの本も読んでみたいと思います。 bleisさん、ご丁寧にありがとうございました! この質問はこれでよさそうなのでここで締め切りとさせていただきますね。

  • bleis
  • ベストアンサー率68% (11/16)
回答No.2

> ということは、「:」はこの場合「コンストラクタ特有のもの」という解釈で正解ですか? そうですね。コンストラクタ以外では使用できません。 > …ということは、bleisさんの hogeのvala > は、valにaがくっついているのかな…?そういう宣言が何か出来るのか…?と、自分の知識を不安に思いましたが > 実際にはごくシンプルで、些細なタイプミスという事で大丈夫でしょうか? はい、タイプミスです。すみません。 > 「構造体に対して」は、templateは使えない、のでしょうか? 構造体でも使用できますよ。 上であげた例では構造体を使用しています。 C++ではclassとstructの違いは、デフォルトのアクセス修飾子だけですので、まとめて「クラス」と表記しました。説明が足りなかったかもしれないですね。 > あるクラスのヘッダにtemplate<>つきの関数を宣言し > ソースに内容を書きます。 これは今のところできません。 なぜなら、templateはコンパイル時に全て解決する必要があるためです。

LongSecret
質問者

お礼

ありがとうございます。 それでは…あとひと押しお願いします。 ということは、と思い、ヘッダに書いたら今度はうまくできました。 …ならば 正確には、「ソース」とはコンパイルの後覗かれる・・・というわけですか? 対して「ビルド」は、一連の、全体ですよね? そしてつまり 実際に別クラスから関数呼び出しを実現しようとする場合は template< > の型が絡む関数・クラスや構造体のメンバ、は、どうしても このように 内容含めすべてをヘッダファイルに書くべき、ということになるのでしょうか?