2012-03-22 9 views
16

とセグメンテーションフォールトは、コード内部コンパイルエラー:G ++ここでは4.3.5

//fail_.cpp 
    template< unsigned char X, class L> 
    class A { 
     public: 
     typedef void (A::*fptr)(); 
     class B { 
      public: B(typename A< X, L> ::fptr); 
     }; 
    }; 
    template < unsigned char X, typename L > 
    A<X,L>::B::B (fptr) { } 

g++ -c fail_.cpp

fail_.cpp:11: internal compiler error: Segmentation fault
Please submit a full bug report, with preprocessed source if appropriate.
See < file:///usr/share/doc/gcc-4.3/README.Bugs > for instructions.

をg ++ 4.3.5で私にはバグのように見える与え

ですg ++ 4.4以降では、このようなセグメンテーションが発生しません。

あなたはどう思いますか?コード自体に何か問題はありますか?

+27

内部コンパイラエラーは常にバグです。コードに何らかの問題がある場合、コンパイラは実際のエラーメッセージを生成し、クラッシュしません。 –

+0

私によく見えます。おそらく内部クラスを 'class B {public:B(fptr);}に単純化しようとしたでしょう。 }; '。 typedefをそこに表示する必要があります。 –

+1

興味深いことに、 'typename A < X, L> :: fptr'を*定義*に書くと面白いです:http://ideone.com/0OOpn – Nawaz

答えて

-1

テンプレートセクションのクラスの代わりにtypenameを使用する必要があります。

内部クラスBでは、関数ポインタを渡すにはキーワードAのtypenameが必要ではありません。A < X、L>がその時点でコンパイラにすでに認識されているためです。

そして、型の前にtypenameを指定すると、コンパイラが不正な形式になることがあります(未定義の動作かもしれません)。

1

gcc 4.2でも同様のエラーが発生します。他の人が言ったように、内部エラーが何かが、それは悪かったあなたのコードだということを意味するものではありませんを行い、コンパイラ、内部ひどく間違っていたことを意味します。

g ++ 4.6とclang 3.0では正常に動作します。

関連する問題