2016-05-27 70 views
8

Aynı soru sorulmuştur: GCC neden özel bir yuvalanmış sınıftan devralmaya izin veriyor? Şablon olmayan sınıflar için, özel iç içe geçmiş sınıflardan, , arkadaş sınıfı ise, şablon sınıfları için devralmasına izin verilir. Bu bir hata mı? 5.3.0 ++ gGCC, arkadaşınız olduğunda neden özel bir yuvalanmış sınıftan miras almaya izin vermiyor?

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:

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

Eğer derleyici sürümü hakkında emin misin? Bu, [burada] (https://godbolt.org/g/1uUkge) g ++ 4.9.0 ve daha büyük, 5.3.0 dahil olmak üzere iyi derler. Ancak önceki sürümlerle değil. – user2079303

+0

Eh, Eclipse/CDT Cygwin Miscellaneous --version ile çeviri yapıyorum ve çıktı: g ++ (GCC) 5.3.0 – gerdi

cevap

5

Bu kesinlikle bir gcc hatadır. gcc arkadaşlık ve şablonlar ile lots of issues var. Bu örnek neredeyse tam [class.friend] altında, standart görünür vurgu mayın:

arkadaş olmak için bir sınıf deklarasyonu sınıf verilmesi dostluk özel ve korunan üyelerin isimleri olabilir ima taban belirleyicileri'da ve arkadaşça sınıfın üye beyanlarında erişilir.
[Örnek:

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 örnek]