[英]Template class derived from private member class breaks encapsulation
我发现打破 class 中派生的 class 封装似乎是一种奇怪的方法
采取以下
class Base
{
private:
class Member
{
public:
virtual ~Member() {}
virtual void Function() = 0;
};
};
如果您尝试从这个私有 class 派生
class DerivedMember : public Base::Member
{
public:
DerivedMember() {}
virtual void Function() {/*Do something*/}
};
你得到一个编译错误
error: 'class Base::Member' is private
error: within this context
但是,如果您从中派生模板
template <typename T>
class TemplateDerivedMember : public Base::Member
{
public:
TemplateDerivedMember () {}
virtual void Function() {/*Do something*/}
};
然后编译器将接受它,并允许这种情况发生。
我已经针对 GCC 8.1 和 GCC 4.6 对此进行了测试,并且两者都具有相同的行为。 这是一个错误,还是应该允许的? 将它作为模板派生 class 是否隐含地将TemplateDerivedMember
class 作为Base
的成员? (它似乎无法在全局命名空间中访问)
是的,这是一个错误,显然自 GCC 11 以来已修复。据我所知,Clang 和 MSVC 总是拒绝该代码。 演示: https://gcc.godbolt.org/z/9evfYq5hc
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.