我是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()方法在智能指针下返回原始指针,以与旧版代码兼容。

10-07 16:58