2009-03-18 31 views
22

Trình biên dịch g ++ phàn nàn với lỗi này khi tôi tuyên bố một người bạn thusly:một lớp-key phải được khai báo khi tuyên bố một người bạn

friend MyClass; 

thay vì

friend class MyClass; 

Tại sao nên việc lớp từ khóa được yêu cầu? (trình biên dịch Borland C++, BTW, không yêu cầu nó.)

Trình biên dịch có thể đơn giản tra cứu MyClass trong bảng ký hiệu và cho biết nó được khai báo là lớp? (nó rõ ràng là đang tìm kiếm vì nó phàn nàn khi MyClass không được khai báo)

Nó không giống như nó đang khai báo lớp: Tôi vẫn phải khai báo lớp trên hoặc ít nhất đã chuyển tiếp tuyên bố nó.

Nó sẽ làm cho ý nghĩa với tôi (sẽ là tuyệt vời thực sự) nếu

friend class MyClass; 

làm cho một tuyên bố về phía trước, nếu cần thiết, nếu không nó chỉ có vẻ như muối cú pháp đối với tôi.

Tôi đã được vui vẻ sử dụng bạn báo cáo mà không có từ khóa lớp hoặc struct không có khiếu nại trình biên dịch cho gần 20 năm. Đây có phải là một cái gì đó khá mới?

+1

20 năm! Bạn phải đã làm việc với Bjorn. –

+0

Tôi đã sử dụng C-Front khi tôi tốt nghiệp năm 1989. Tôi đã sử dụng chủ yếu Borland C++ kể từ khoảng năm 1991. –

+3

@Martin: Bjorn ?! Lol. –

Trả lời

22

Tôi rất ngạc nhiên về điều này (và kết quả là bị xóa một câu trả lời không chính xác trước). Tiêu chuẩn C++ 03 cho biết trong 11.4:

Trình chỉ định kiểu phức tạp được sử dụng trong khai báo bạn bè cho một lớp.

Sau đó, để đảm bảo không có sự hiểu lầm, nó chú thích rằng với:

Lớp-key của xây dựng-type-specifier là bắt buộc.

GCC là trình biên dịch duy nhất mà tôi có mà phàn nàn về thiếu tầm cỡ quan trọng, nhưng có vẻ như các trình biên dịch khác được cho chúng tôi nhận được ngay với một cái gì đó phi tiêu chuẩn ...

Bây giờ như đối với lý do - bạn phải hỏi ai đó biết nhiều hơn về trình biên dịch (hoặc tiêu chuẩn) hơn tôi.

+2

' friend' mà không có khóa-class hoạt động theo g ++ 4.7.0/4.7.3 với tùy chọn '-std = C++ 11' – Interarticle

+0

Sẽ tốt hơn Nếu bạn cập nhật câu trả lời của mình theo C++ 11, C++ 11 đã giới thiệu __extended friend declarationations__. Xem https://www.ibm.com/developerworks/community/blogs/5894415f-be62-4bc0-81c5-3956e82276f3/entry/introduction_to_the_c_11_feature_extended_friend_declaration3?lang=vi – Destructor

22

Đến điểm câu hỏi của bạn, vì đây là cách ISO/IEC 14882: 2003 chỉ định nó (mục 7.1.4). Các friend xây dựng cơ bản được quy định như sau:

friend <declaration> 

nơi <declaration> là việc kê khai giá trị của một lớp, struct, mẫu, hoặc chức năng.

Như vậy,

MyClass; 

không phải là một tuyên bố hợp lệ, trong khi:

class MyClass; 

hay:

struct MyClass; 

đang có.

Idem cho, tương ứng:

friend class MyClass; 

hoặc

friend struct MyClass; 
+0

Cảm ơn bạn vì điều này, các bạn đã cứu thịt xông khói của tôi hôm nay. – Rokujolady

+0

Câu trả lời hay, đá GCC :) – ierax

+0

Và nếu 'MyClass' là một mẫu lớp, khai báo' friend' yêu cầu 'template' cũng là –

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