私の無知をさらけ出しつつしつこく続けるこのシリーズ。何回目だろ。
今回は無能もさらけ出してオーバーロードの解決:
template< typename t > void foo( t );
template<> void foo( double ){ cout << "template<> void foo(double)" << endl; }
void foo( double ){ cout << "void foo(double)" << endl; }
void test()
{
foo(1.0); // void foo( double ); が呼ばれる。
}コンパイルエラーかリンクエラーになると思っていたんだが、コンパイルもリンクもできて、非template版が呼ばれるのが正しいらしい。
知らなかった。
もう一つ:
template< typename t > void bar( t );
template<> void bar( double ){ cout << "template<> void bar(double)" << endl; }
template<> void bar( double & ){ cout << "template<> void bar(double &)" << endl; }
template<> void bar( const double & ){ cout << "template<> void bar(const double &)" << endl; }
void test()
{
double d=1.0;
double & r = d;
const double & cr = d;
bar( d );
bar( r );
bar( cr );
bar( (double &)d );
bar( (const double &)d );
}全部 bar(double)が呼ばれる。たぶん、これで仕様通り。よーく考えると、ああそうか、という気にもなれる。かもしれない。
最近ちょっぴりオーバーロードの解決ルールに対する理解が深まったんだが、完璧に理解できる日が来るような気は全くしない。あまりにも難しいと思う。
#写真と本文は関係ありません。