桜、抹茶、白、日記

名古屋市在住のC++使いのcoderの日記だったもの。

型キャスト

d:id:youandi:20060503#p3
const void*型 を void*型 に突っ込んだつもりだったが、オーバーロードで bool型 のI/Fもあった為、bool型 で動作してしまってた。

 #include <stdlib.h>
 #include <stdio.h>
 class CHoge {
 public:
   static void Func( bool bHoge )  { fprintf( stdout, "bool\n" ); }
   static void Func( void* pHoge ) { fprintf( stdout, "void*\n" ); }
 };
 int main( int nArgC, char** ppArgV ) {
   const double dHoge = 1.0;
   CHoge::Func( reinterpret_cast<const void*>( &dHoge ) );
   (void)::fgetc( stdin );
   return 0;
 }

実行結果は「bool」が返ってくる。
因みにLinux上のGCCだと特にワーニングはでないが、VisualC++6.0ではbool型に変換されるとのワーニングが出る。Linux上でデバッグしても埒ががあかなかったのでWindows上でやってみたら一発解決・・・orz。先週末から約一日無駄にしてしまった。
なまじっかC++のキャストスタイルにした際に手抜きをした為発生。正しくは下記のようにする。

   CHoge::Func( const_cast< void* >( reinterpret_cast< const void* >( &dHoge ) ) );
   CHoge::Func( reinterpret_cast< void* >( const_cast< double* >( &dHoge ) ) );

まだまだ修行が足りん。これに懲りてC言語スタイルのキャストに甘んじたりはしない。C++スタイルで行く。