![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67)
おそらくC++の内容ではないかと思うのですが
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<class ○○> つき関数と
「:」
記号は、別々に何か意味があるのでしょうか?
ラベルとか三項演算子等のそれとはおそらく別物ですよね…?
templateにつけたら何らかの効果がつく、拡張(?)機能なのでしょうか?
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;
の違いと同じです。
なるほど!
ありがとうございます。
少々ややこしい分量の作業で確認してみました。
ある関数を返り値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<>つきの関数を宣言し
ソースに内容を書きます。
それを、別クラスのメンバにそのクラスを持たせて
そのインスタンスからその関数を呼び出そうとすると
「外部参照が未解決です」
絡みのエラーが出てきて、ビルドが出来ません。
これはどのような場合に発生して、またどうすれば解決できるのでしょうか?
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です。
確かに言われてみると、エラーの場所(?)がobjだった気がします。
それらの本も読んでみたいと思います。
bleisさん、ご丁寧にありがとうございました!
この質問はこれでよさそうなのでここで締め切りとさせていただきますね。
No.2
- 回答日時:
> ということは、「:」はこの場合「コンストラクタ特有のもの」という解釈で正解ですか?
そうですね。コンストラクタ以外では使用できません。
> …ということは、bleisさんの hogeのvala
> は、valにaがくっついているのかな…?そういう宣言が何か出来るのか…?と、自分の知識を不安に思いましたが
> 実際にはごくシンプルで、些細なタイプミスという事で大丈夫でしょうか?
はい、タイプミスです。すみません。
> 「構造体に対して」は、templateは使えない、のでしょうか?
構造体でも使用できますよ。
上であげた例では構造体を使用しています。
C++ではclassとstructの違いは、デフォルトのアクセス修飾子だけですので、まとめて「クラス」と表記しました。説明が足りなかったかもしれないですね。
> あるクラスのヘッダにtemplate<>つきの関数を宣言し
> ソースに内容を書きます。
これは今のところできません。
なぜなら、templateはコンパイル時に全て解決する必要があるためです。
ありがとうございます。
それでは…あとひと押しお願いします。
ということは、と思い、ヘッダに書いたら今度はうまくできました。
…ならば
正確には、「ソース」とはコンパイルの後覗かれる・・・というわけですか?
対して「ビルド」は、一連の、全体ですよね?
そしてつまり
実際に別クラスから関数呼び出しを実現しようとする場合は
template< > の型が絡む関数・クラスや構造体のメンバ、は、どうしても
このように
内容含めすべてをヘッダファイルに書くべき、ということになるのでしょうか?
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- HTML・CSS CSSのホバーエフェクト 1 2023/06/19 06:53
- HTML・CSS ブロックエディターで作りつつ、画像を挿入しつつ、画像にスタイルシートのコードを付ける方法はありますか 1 2022/08/23 18:46
- JavaScript セレクトを全て選択されていないと、文字によるエラーメッセージを表示させるコードを調べています 2 2023/06/22 15:48
- PHP SQLとPHPの連結方法がわからないのでアドバイスお願い致します 1 2022/07/12 12:16
- Java java final 1 2022/06/10 22:49
- PHP アコーディオンPHPが上手くいかない 3 2022/07/15 16:29
- HTML・CSS サルワカさんの吹き出しのスタイルシートについて。 https://saruwakakun.com/h 2 2022/10/28 22:55
- PHP アップロード画像数でCSSを分けることに成功したのですが、画像の横に文字を並べることが出来ません。 3 2023/07/28 17:16
- PHP PHPの構文で間違えが分からない 5 2022/07/11 16:38
- PHP style.cssのjQuery条件付きcssが機能しない 4 2022/07/17 18:27
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
long型の定数の末尾にLを付ける...
-
C++でboolにintの値を代入する...
-
分割コンパイル時に構造体....
-
C言語での方向キー入力判定
-
main.c:7:43: warning: implici...
-
関数の実体定義にヘッダファイ...
-
visualstudio C# テキストボッ...
-
構造体の宣言でエラーが出ます。
-
intとINTの違いは?
-
【#define】 defineで定義した...
-
C++の(左辺値)参照を参照渡し
-
コンパイルエラー
-
構造体の要素すべてに対する四...
-
2重定義って??
-
C言語でのフィボナッチ数列の表示
-
DLLでLIBファイルが作成されない
-
変数の型を定義しなかった場合...
-
staticで初期化した変数(?)を使...
-
C++の規格
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
DWORDの実際の型は何でしょうか
-
long型の定数の末尾にLを付ける...
-
2重定義って??
-
visualstudio C# テキストボッ...
-
C++のfor文について
-
構造体の要素すべてに対する四...
-
typedef enumの使い方を教えて...
-
変数の型を定義しなかった場合...
-
ハンドルされていない例外が発...
-
関数の実体定義にヘッダファイ...
-
intとINTの違いは?
-
【#define】 defineで定義した...
-
C++でboolにintの値を代入する...
-
構造体の宣言でエラーが出ます。
-
main.c:7:43: warning: implici...
-
プログラムの中で別のmainを呼...
-
void func( void )について
-
エラー「invalid conversion fr...
-
C言語 宣言した変数になにも代...
-
0除算を判定したい
おすすめ情報