2016-05-27 33 views
8

Cùng một câu hỏi được hỏi: Tại sao GCC cho phép kế thừa từ một lớp lồng nhau riêng? Đối với các lớp không phải mẫu, được phép kế thừa từ các lớp lồng nhau riêng, nếu đó là một người bạn, nhưng không được cho các lớp mẫu. Đây có phải là lỗi không?Tại sao GCC không cho phép kế thừa từ lớp lồng nhau riêng tư khi bạn là bạn?

template<class Base> 
class InheritFromBaseMember : public Base::MemberPrivate // error 
{ 
    using PrivateMember = typename Base::MemberPrivate; // works fine 
}; 

class MyBase{ 
    friend class InheritFromBaseMember<MyBase>; 

    // another try to declare it friend 
    template<class T> 
    friend class InheritFromBaseMember; 

    friend class AnotherClass; 

    class MemberPrivate{}; 
}; 

class AnotherClass : public MyBase::MemberPrivate{}; // works fine 

int main() { 
    InheritFromBaseMember<MyBase>{}; 
} 

ERRORMESSAGE từ g ++ 5.3.0:

error: 'class MyBase::MemberPrivate' is private 
    class MemberPrivate{}; 
     ^
error: within this context 
class InheritFromBaseMember : public Base::MemberPrivate // error 
    ^
+1

Bạn có chắc chắn về phiên bản trình biên dịch? Nó biên dịch [ở đây] (https://godbolt.org/g/1uUkge) tốt với g ++ 4.9.0 trở lên, bao gồm 5.3.0. Nhưng không phải với các phiên bản trước đó. – user2079303

+0

Vâng, tôi dịch với Eclipse/CDT Cygwin Miscellaneous --version và đầu ra là: g ++ (GCC) 5.3.0 – gerdi

Trả lời

5

này chắc chắn là một lỗi gcc. gcc có lots of issues với tình bạn và các mẫu. Ví dụ này gần như chính xác xuất hiện trong tiêu chuẩn, dưới [class.friend], tôi nhấn mạnh:

Khai báo một lớp là một người bạn ngụ ý rằng tên của các thành viên private và protected từ quan hệ hữu nghị lớp cấp có thể được truy cập trong các thông số cơ bản và khai báo thành viên của lớp bạn bè.
[Ví dụ:

class A { 
class B { }; 
    friend class X; 
}; 

struct X : A::B { // OK: A::B accessible to friend 
    A::B mx;  // OK: A::B accessible to member of friend 
    class Y { 
     A::B my; // OK: A::B accessible to nested member of friend 
    }; 
}; 

-end dụ]

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