Đang cố gắng để biên dịch đoạn mã sau vào trình biên dịch khác nhau mang lại cho tôi hai kết quả khác nhau:Có thể một thành viên của một lớp được đặt tên giống với tên của nó (lớp khác) không?
struct S{};
struct T{S S;};
int main(){}
Như bạn có thể thấy, bên trong T
, tôi có một đối tượng có tên giống như các lớp được định nghĩa trước S
.
On GCC 4.7.2, I get the following error liên quan đến việc kê khai S S;
bên T
:
error: declaration of 'S T::S' [-fpermissive]
error: changes meaning of 'S' from 'struct S' [-fpermissive]
Tuy nhiên, di chuyển nó bên ngoài của lớp (hoặc vào main
) works fine:
struct S{};
S S;
int main(){}
Lỗi chính xác có nghĩa là gì?
Trong Visual Studio 2012, toàn bộ việc biên dịch và chạy mà không có bất kỳ lỗi nào. Dán nó vào this Clang 3.0 compiler cũng không có lỗi.
Điều gì là đúng? Tôi có thể thực sự làm điều này hay không?
Ah, tôi hiểu - tôi đã đọc sai chẩn đoán. – ildjarn
@ildjarn, Đó là một lá cờ khá lạ. Dường như nó hoạt động ngược lại. Thông thường, cờ chịu trách nhiệm cảnh báo xuất hiện trong dấu ngoặc vuông. – chris
Chỉ cần không. Vấn đề ở đây là gì? Nhầm lẫn? Lưu ý rằng sau khi bạn đã làm điều đó, bạn không còn có thể tham chiếu đến kiểu 'S' trong các hàm thành viên mà không đủ điều kiện rõ ràng vùng tên ... –