我使用以下代码收到编译时错误。在第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;迭代器类型也需要暴露。
答案 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以获得解释。