我是shared_ptr概念的新手,正尝试重新构造程序,使其使用智能指针而不是常规指针。我非常想在Xerces-c中使用shared_ptr,但是在初始化错误处理程序时遇到了麻烦。
我有一个实现errorHandler的类。
class Handler: public ErrorHandler {
public:
void warning (const SAXParseException&) { cerr << "THIS IS A WARNING\n";}
void error (const SAXParseException&) { cerr << "THIS IS A ERROR\n"; return;}
void fatalError(const SAXParseException&) { cerr << "THIS IS A FATALERROR\n";}
void resetErrors() {}
}
在实现中,我尝试将已从ErrorHandler实现的类传递给setErrorHandler函数:
boost::shared_ptr<XercesDOMParser> m_Parser;
boost::shared_ptr<Validator> m_ErrorHandler;
m_ErrorHandler = boost::shared_ptr<Handler>(new Handler());
m_Parser->setErrorHandler(m_ErrorHandler);
但是由于类型不匹配而在最后一行出错了:
错误:没有匹配的函数可以调用“xercesc_3_1::XercesDOMParser::setErrorHandler(boost::shared_ptr&)”
/opt/include/xercesc/parsers/XercesDOMParser.hpp:236:注意:候选对象为:void xercesc_3_1::XercesDOMParser::setErrorHandler(xercesc_3_1::ErrorHandler *)
使用常规指针,可以这样说:
XercesDOMParser * m_Parser;
Handler * errorHandler;
m_Parser = new XercesDOMParser;
errorHandler = new Handler();
m_Parser->setErrorHandler(errorHandler);
但是,当使用智能指针时,该初始化如何完成?谢谢
最佳答案
如果m_Parser不使用shared_ptr,则无法实现。 shared_ptr不是灵丹妙药,您只能在自己的代码中使用它们。您可以使用.get()方法在智能指针下返回原始指针,以与旧版代码兼容。