1

我收到以下代码的编译时错误。在第 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 和迭代器类型。

4

1 回答 1

3

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

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

在定义中添加两个 using 声明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
}

我不熟悉这个宏的确切实现,但我相信这是你得到的错误的症结所在。如果您有兴趣,请深入研究它的源代码,也许可以阅读这篇不错的文章以获得解释。

于 2013-07-21T12:25:50.157 回答