ger*_*rdi 9 c++ inheritance templates nested friend
同样的问题:为什么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>{};
}
Run Code Online (Sandbox Code Playgroud)
来自g ++ 5.3.0的错误消息:
error: 'class MyBase::MemberPrivate' is private
class MemberPrivate{};
^
error: within this context
class InheritFromBaseMember : public Base::MemberPrivate // error
^
Run Code Online (Sandbox Code Playgroud)
这绝对是一个gcc bug.gcc在友谊和模板方面存在很多问题.这个例子几乎完全出现在标准的[class.friend]下,强调我的:
将类声明为朋友意味着可以在友好类的基本说明符和成员声明中访问授予友谊的类中的私有成员和受保护成员的名称.
[例如:Run Code Online (Sandbox Code Playgroud)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 }; };- 末端的例子]
| 归档时间: |
|
| 查看次数: |
156 次 |
| 最近记录: |