2016-05-27 17 views
8

Viene posta la stessa domanda: Perché GCC consente l'ereditarietà da una classe nidificata privata? Per le classi non template, è consentito ereditare da classi nidificate private, se è un amico, ma non per le classi template. È un bug?Perché GCC non consente l'ereditazione da una classe nidificata privata quando sei un amico?

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

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

Sei sicuro circa la versione del compilatore? Compila [qui] (https://godbolt.org/g/1uUkge) bene con g ++ 4.9.0 e successivi, incluso 5.3.0. Ma non con le versioni precedenti. – user2079303

+0

Bene, io traduco con Eclipse/CDT Cygwin Miscellaneous --version e l'output è: g ++ (GCC) 5.3.0 – gerdi

risposta

5

questo è sicuramente un bug gcc. gcc ha lots of issues con amicizia e modelli. Questo esempio appare quasi esattamente nella norma, sotto [class.friend], l'enfasi è mia:

Dichiarazione di una classe per essere un amico implica che i nomi dei membri privati ​​e protetti dalla amicizia classe concessione possono essere accesso negli specificatori di base e dichiarazioni membro della classe di amici.
[Esempio:

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 esempio]

Problemi correlati