電子書籍の厳選無料作品が豊富!

おそらく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につけたら何らかの効果がつく、拡張(?)機能なのでしょうか?

A 回答 (3件)

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;
の違いと同じです。

この回答への補足

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

補足日時:2009/01/26 18:54
    • good
    • 0
この回答へのお礼

なるほど!
ありがとうございます。

少々ややこしい分量の作業で確認してみました。
ある関数を返り値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<>つきの関数を宣言し
ソースに内容を書きます。

それを、別クラスのメンバにそのクラスを持たせて
そのインスタンスからその関数を呼び出そうとすると

「外部参照が未解決です」

絡みのエラーが出てきて、ビルドが出来ません。
これはどのような場合に発生して、またどうすれば解決できるのでしょうか?

お礼日時:2009/01/26 18:53

> 正確には、「ソース」とはコンパイルの後覗かれる・・・というわけですか?


> 対して「ビルド」は、一連の、全体ですよね?
ソースファイルは、コンパイル段階でオブジェクトファイルというものに変換され、それらをリンクして実行ファイルを生成します。
この一連の動作を全て行うのがビルドです。

> そしてつまり
> 実際に別クラスから関数呼び出しを実現しようとする場合は
> template< > の型が絡む関数・クラスや構造体のメンバ、は、どうしても
> このように
> 内容含めすべてをヘッダファイルに書くべき、ということになるのでしょうか?
そういうことになりますね。

templateの使い方については、Modern C++ Designという本が非常に技巧的な使い方をしており、参考になると思います。
Modern C++ DesignはC++ in-Depth SeriesというC++を深く理解するために非常にためになるシリーズの中の1つです。
ほかのC++ in-Depth Seriesも読んでみるといいかもしれません。
おすすめは、Exceptional C++とExceptional C++ Styleです。
    • good
    • 0
この回答へのお礼

確かに言われてみると、エラーの場所(?)がobjだった気がします。
それらの本も読んでみたいと思います。

bleisさん、ご丁寧にありがとうございました!
この質問はこれでよさそうなのでここで締め切りとさせていただきますね。

お礼日時:2009/01/26 23:59

> ということは、「:」はこの場合「コンストラクタ特有のもの」という解釈で正解ですか?


そうですね。コンストラクタ以外では使用できません。

> …ということは、bleisさんの hogeのvala
> は、valにaがくっついているのかな…?そういう宣言が何か出来るのか…?と、自分の知識を不安に思いましたが
> 実際にはごくシンプルで、些細なタイプミスという事で大丈夫でしょうか?
はい、タイプミスです。すみません。

> 「構造体に対して」は、templateは使えない、のでしょうか?
構造体でも使用できますよ。
上であげた例では構造体を使用しています。
C++ではclassとstructの違いは、デフォルトのアクセス修飾子だけですので、まとめて「クラス」と表記しました。説明が足りなかったかもしれないですね。

> あるクラスのヘッダにtemplate<>つきの関数を宣言し
> ソースに内容を書きます。
これは今のところできません。
なぜなら、templateはコンパイル時に全て解決する必要があるためです。
    • good
    • 0
この回答へのお礼

ありがとうございます。
それでは…あとひと押しお願いします。

ということは、と思い、ヘッダに書いたら今度はうまくできました。

…ならば
正確には、「ソース」とはコンパイルの後覗かれる・・・というわけですか?
対して「ビルド」は、一連の、全体ですよね?

そしてつまり
実際に別クラスから関数呼び出しを実現しようとする場合は
template< > の型が絡む関数・クラスや構造体のメンバ、は、どうしても
このように
内容含めすべてをヘッダファイルに書くべき、ということになるのでしょうか?

お礼日時:2009/01/26 21:35

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!