class private_object
{
private:
struct make_public;
friend struct make_public;
static void method1() {}
};
struct private_object::make_public
{
class nested_outer
{
void callFromOuter()
{ private_object::method1(); } // Should this be an error?
class nested_inner
{
void callFromInner()
{ private_object::method1(); } // How about this one?
};
};
};
Vấn đề về tình bạn này xuất hiện khi tôi cố gắng chuyển một dự án mã nguồn mở để biên dịch dưới borland. Theo parashift và hai câu hỏi bán liên quan here và here, ví dụ trên không nên hợp lệ.Bạn bè có phải là người chuyển tiếp trong các lớp lồng nhau không?
Tuy nhiên, sau khi thử nghiệm trên bảy các trình biên dịch khác nhau , chỉ borland và dmc bị khiếu nại. Hành vi này làm tôi ngạc nhiên bởi vì tôi đã không mong đợi tình bạn để được transitive trong các lớp lồng nhau.
Vì vậy, đây đặt ra một vài câu hỏi:
- hành vi đúng đắn là gì? Tôi đoán nó là một trong những chấp nhận bởi hầu hết các trình biên dịch.
- Nếu đây là hành vi đúng, lý do tại sao trường hợp này là tình trạng chuyển tiếp tình bạn ok?
- Nếu điều này đúng thì điều đó cũng ngụ ý sự thay đổi trong tiêu chuẩn. Điều gì có thể là lý do cho phép điều này trong tiêu chuẩn?
- Đối với các trình biên dịch đã từ chối mã này, điều gì sẽ là giải pháp thích hợp? Hãy nhớ rằng một dự án thực tế có thể chứa khá sâu làm tổ nên tôi đang tìm một giải pháp có khả năng bán mở rộng.
1. thử nghiệm trên mingw-gcc 4.5.2, kêu vang, borland C++ builder2007, mars kỹ thuật số, watcom mở, visualc2010 và comeau trực tuyến