我有一个抽象基类A和一组10个派生类.中缀运算符在所有派生类中都被重载
class A{
public:
void printNode( std::ostream& os )
{
this->printNode_p();
}
protected:
virtual void printNode_p( std::ostream& os )
{
os << (*this);
}
};
Run Code Online (Sandbox Code Playgroud)
有一个存储基类指针的容器.我想使用boost :: bind函数在每个派生类中调用重载的中缀运算符.我写得像这样
std::vector<A*> m_args
....
std::ostream os;
for_each( m_args.begin(), m_args.end(), bind(&A::printNode, _1, os) );
Run Code Online (Sandbox Code Playgroud)
这段代码有什么问题?在visual studio中,我收到这样的错误
错误C2248:'std :: basic_ios <_Elem,_Traits> :: basic_ios':无法访问类'std :: basic_ios <_Elem,_Traits>'中声明的私有成员
谢谢,Gokul.
考虑一下,它按预期工作:
#include <iostream>
struct base
{
virtual ~base(void) {}
virtual void print(std::ostream& pStream) = 0;
};
struct foo : base
{
void print(std::ostream& pStream) { pStream << "foo" << std::endl; }
};
struct bar : base
{
void print(std::ostream& pStream) { pStream << "bar" << std::endl; }
};
#include <boost/bind.hpp>
#include <boost/ptr_container/ptr_vector.hpp>
#include <algorithm>
int main(void)
{
boost::ptr_vector<base> v;
v.push_back(new foo);
v.push_back(new bar);
std::for_each(v.begin(), v.end(),
boost::bind(&base::print, _1, boost::ref(std::cout)));
}
Run Code Online (Sandbox Code Playgroud)
首先,因为您正在使用boost,所以您也可以使用它ptr_vector来处理内存管理.所以,就在那里.
其次,您的错误是因为流不可复制 ; 但是,boost::bind在构造仿函数时会复制所有它的参数.将其包裹在boost::reference_wrapper(使用boost::ref效用函数)中,这是可复制的.到时候,包装器将转换为必要的类型,你不会注意到差异.
(这是其中一种情况boost::ref.)
这一切都说,考虑使用BOOST_FOREACH,在我看来生成最干净的代码:
#include <boost/foreach.hpp>
#include <boost/ptr_container/ptr_vector.hpp>
#include <algorithm>
#define foreach BOOST_FOREACH
int main(void)
{
boost::ptr_vector<base> v;
v.push_back(new foo);
v.push_back(new bar);
foreach (base* b, v)
{
v->print(std::cout);
}
}
Run Code Online (Sandbox Code Playgroud)