【发布时间】:2012-09-21 15:27:35
【问题描述】:
我创建了一个新类,它通过私有继承组成std::deque,即,
class B : private std::deque<A>
{ ... };
在我的源代码中,我尝试使用 B 的迭代器,即,
B::iterator it
编译错误是
error C2247: 'std::deque<_Ty>::iterator' not accessible because 'B' uses 'private' to inherit from 'std::deque<_Ty>'
所以问题是,我怎样才能使迭代器可访问?
【问题讨论】:
-
@TonyTheLion 你所说的不适用于私有继承,因为不能将
B多态绑定到std::deque指针或引用。 -
@juanchopanza: 同意,尽管注意
B类可以,如果它这么愚蠢,那么B的作者需要小心。 B 类的用户不能,至少不能没有不安全的技巧,他们应该知道比使用更好。我认为 C 风格的转换可以做到这一点,但是无论标准容器是私有基地、公共基地还是根本不是基地,紧随其后的 C 风格演员delete都会中断! -
@TonyTheLion:
they won't destroy properly when inherited from- 这听起来像是货物崇拜编程。您的担忧仅适用于派生类通过基类指针销毁的情况。这对于私有继承是不可能的。 -
@FrerichRaabe:是的,你是对的,我错了。我不知道私有继承本质上与组合相同。
-
FWIW,您可能不应该将其视为“使
iterator可用”,您应该将其视为“提供iterator”,因为B是使用@ 实现的987654334@,自然可以是deque::iterator。不过,最终的结果是一样的。
标签: c++ stl std inner-classes