私の無知をさらけ出しつつしつこく続けるこのシリーズ。何回目だろ。
今回は無能もさらけ出してオーバーロードの解決:
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)が呼ばれる。たぶん、これで仕様通り。よーく考えると、ああそうか、という気にもなれる。かもしれない。
最近ちょっぴりオーバーロードの解決ルールに対する理解が深まったんだが、完璧に理解できる日が来るような気は全くしない。あまりにも難しいと思う。
#写真と本文は関係ありません。