2016-05-27 23 views
8

To samo pytanie jest zadawane: Dlaczego GCC pozwala dziedziczyć z prywatnej klasy zagnieżdżonej? W przypadku klas innych szablonów, dozwolone jest dziedziczenie z prywatnych klas zagnieżdżonych, jeśli jest to przyjaciel, ale nie dla klas szablonów. Czy to błąd?Dlaczego GCC nie pozwala na dziedziczenie z prywatnej klasy zagnieżdżonej, gdy jesteś przyjacielem?

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 z g ++ 5.3.0:

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

Czy na pewno o wersji kompilatora? Kompiluje [tutaj] (https://godbolt.org/g/1uUkge) dobrze z g ++ 4.9.0 i nowszymi, w tym 5.3.0. Ale nie we wcześniejszych wersjach. – user2079303

+0

Cóż, tłumaczę z Eclipse/CDT Cygwin Miscellaneous --version, a wynik to: g ++ (GCC) 5.3.0 – gerdi

Odpowiedz

5

Jest to zdecydowanie gcc bug. gcc ma lots of issues przyjaźń i szablony. Przykład ten pojawia się niemal dokładnie w normie, pod [class.friend], moje podkreślenie:

Deklarowanie klasy być przyjacielem oznacza, że ​​nazwy użytkowników prywatnych i chronionych z klasy udzielającej przyjaźni może być dostępne w specyfikatorach bazowych i deklaracjami członków zaprzyjaźnionej klasy.
[Przykład:

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 
    }; 
}; 

końcem przykład]