2012-03-22 30 views
16

Đây là mãbiên dịch nội bộ lỗi: lỗi phân khúc với 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 cho

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.

Trông giống như một lỗi với tôi bằng g ++ 4.3.5, g ++ 4.4 và cao hơn không đưa ra bất kỳ phân đoạn nào như vậy.

Các bạn nghĩ sao? Có điều gì sai với mã không?

+27

Lỗi trình biên dịch nội bộ luôn là lỗi. Nếu có điều gì đó sai với mã trình biên dịch sẽ tạo ra một thông báo lỗi thực sự, không phải lỗi. –

+0

Có vẻ ổn với tôi. Tôi có lẽ đã cố gắng đơn giản hóa lớp bên trong thành 'class B {public: B (fptr); }; '. Các typedef sẽ được hiển thị ở đó. –

+1

Thật thú vị, nếu tôi viết 'typename A < X, L> :: fptr' trong định nghĩa * *, nó biên dịch tốt: http://ideone.com/0OOpn – Nawaz

Trả lời

-1

tên tệp phải được sử dụng làm thay thế cho lớp trong phần mẫu.

Trong lớp bên trong B, chuyển con trỏ hàm không yêu cầu tên tệp từ khóa, vì A < X, L> đã được biết đến với trình biên dịch tại điểm đó.

Và có thể đặt tên tệp ở phía trước loại đang khiến trình biên dịch bị biến dạng (có thể là hành vi không xác định?).

1

Tôi thấy lỗi tương tự với gcc 4.2. Như những người khác đã nói, một lỗi nội bộ có nghĩa là đã xảy ra lỗi trong trình biên dịch, điều này có nghĩa là không phải là ngụ ý rằng đó là mã của bạn xấu.

Nó hoạt động tốt trong g ++ 4.6 và clang 3.0.

Các vấn đề liên quan