用容器的保护继承来推动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 };
但是,如果我改变protected
到public
在第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?