用容器的保护继承来推动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 };

但是,如果我改变protectedpublic在第17行,它编译和运行正常。 而且,我可以通过使用具有迭代器的标准锅炉代码来很好地进行迭代。

这是为什么发生? 任何帮助,将不胜感激! :-)

编辑:这是否意味着我不能公开暴露begin()&end()而不能使用BOOST_FOREACH? EDTI2:实际上,const_iterator&iterator类型也需要暴露。


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

BOOST::FOR_EACH实现可能尝试调用begin()end() ,但不能。

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
}

我对这个宏的确切实现并不熟悉,但我认为这是你所得到的错误的关键。 如果你有兴趣,可以参考源代码,也可以阅读这篇不错的文章以获得解释。

链接地址: http://www.djcxy.com/p/47357.html

上一篇: boost foreach with protected inheritance of container

下一篇: Should custom containers have free begin/end functions?