コーディング上の質問ではないのですが、
とあるHPで以下のような記述がありました。
(無断転載不可と書いてあったので趣旨のみを記述します)
----------------------------------------
template <typename T>
T hoge(T a, T b)
{
return a + b;
}
void main()
{
hoge(1, 2); //OK
hoge(1.0, 2.0); //OK
hoge(1, 2.0); //コンパイルエラー
}
hoge(1, 2.0)では第1引数と第2引数型が違うため
テンプレートからインスタンスを生成できない。
これを回避するにはhoge<double>(1, 2.0)と強制的に型キャストして
使うこともできる。
------------------------------------------
手持ちの文法書(C++ Primer改訂3版)をみると
hoge<double>(1, 2.0)という記述は
明示的なテンプレート引数でありキャストという表現は
いっさい出てきません。
そこで質問なのですがhoge<double>(1, 2.0)を
キャストと表現するのは間違っているのでしょうか?
なんか場違いな質問かもしれませんが
よろしくご教授ください。
キャストで良いんじゃないですか
関数のスタック上で明示的に指定された型でキャストされるんですから
違いますかね...
ちょっと試したところ
明らかに無理な型は駄目みたいですね
int i;double d;typedef char* Cp;Cp p;
hoge<double>(reinterpret_cast<int>(p),d);//無理やり
前言撤回
キャストはやっぱり変ですね
hoge<int>(p,d);//これがエラーにはならないはずですからね
double temp=double(1);
a=temp;//コピーされる
ようするにこういうことですねきっと
テンプレートから明示的にインスタンス化した関数に対して、引数を暗黙の型変換
(引数1つのコンストラクタや型変換関数)できるどうか、ということだと思います。
(通常の関数呼び出しで、コンパイラが暗黙の型変換を探すのと同様かと)
おっと回答がない…
結局、明示的に型をキャストしてると言えなくもないですが、正しくは暗黙の型変換であり、
その型変換の対象を明示的に決定してると言いたかったわけです。
キャストではありません。
関数テンプレートの'明示的なインスタンシエーション'
とでも言えばいいのかな。
実は、先のHPとはSDKで開発してる人なら、
おそらく誰でもお世話になったであろう
(あるいは、お世話になっているであろう)
超有名なHPに書かれてあったことです。
この「キャスト」の記述を読んでから、
(これはキャストなの?)と
ずっと気になっていました。
やはり「キャスト」と表現するのは
不適切なのですね。
やっと頭の中がスッキリしました。
ご助言くださった皆様ありがとうございました。