使用受保护的容器继承来提升foreach

时间:2013-07-21 12:09:09

标签: c++ inheritance boost foreach

我使用以下代码收到编译时错误。在第23行使用BOOST_FOREACH时会弹出错误:

17 class MyVec: protected std::vector<int>
18 {
19     public:
20         void add(int i) {   this->push_back(i); }
21         void print()
22         {
23             BOOST_FOREACH(int i, *this)
24                 std::cout << i;
25             std::cout << std::endl;
26         }
27 };

但是,如果我在第17行将protected更改为public,则会编译&amp;按预期运行。此外,我可以通过使用带有迭代器的标准样板代码来迭代。

为什么会这样?任何帮助,将不胜感激! : - )

编辑:这是否意味着我不能在没有公开暴露begin()&amp;的情况下使用BOOST_FOREACH结束() ? EDTI2:实际上,const_iterator&amp;迭代器类型也需要暴露。

1 个答案:

答案 0 :(得分:3)

当您使用protected说明符继承时,基类的公共成员在派生类中受到保护。

BOOST::FOR_EACH实施可能会尝试拨打begin()end(),但不能。{/ p>

MyVec的定义中使用声明添加两个声明为我解决了(我正在使用gcc):

using std::vector<int>::begin;
using std::vector<int>::end;

如果它有助于理解错误,请考虑以下事项:

class MyVec;

void my_foreach(const MyVec&);

class MyVec: protected std::vector<int> {
    void print() {
        my_foreach(*this);
    }
};

void my_foreach(const MyVec& v)
{
    v.begin(); // error std::vector<int> is not an accessible base
}

我不熟悉这个宏的确切实现,但我相信这是你得到的错误的关键。如果您有兴趣,可以深入了解它的源代码,也可以阅读this nice article以获得解释。