2016-05-27 34 views
8

問同樣的問題:爲什麼GCC允許從私有嵌套類繼承? 對於非模板類,它允許從私有嵌套類繼承, 如果它是朋友,但不適用於模板類。 這是一個錯誤?當你是朋友時,爲什麼GCC不允許從私有嵌套類繼承?

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從克++ 5.3.0:

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

你確定編譯器的版本?它編譯[這裏](https://godbolt.org/g/1uUkge)很好用g ++ 4.9.0和更高版本,包括5.3.0。但不適用於早期版本。 – user2079303

+0

那麼,我翻譯與Eclipse/CDT Cygwin其他 - 版本和輸出是:g ++(GCC)5.3.0 – gerdi

回答

5

這絕對是一個gcc錯誤。 gcc有lots of issues有友誼和模板。這個例子幾乎完全出現在標準,在[class.friend],重點煤礦:

聲明一個類是朋友意味着private和protected成員從類 授予友誼的名稱可以訪問基指定符和成員聲明的友好類。
[示例:

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

末端示例]