我对shared_ptr的概念不熟悉,并试图重构我的程序,使其使用智能指针而不是常规指针。我很想尝试将shared_ptr与Xerces-c一起使用,并且我在初始化错误处理程序时遇到了问题。
我有一个实现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&amp;)' /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);
但是在使用智能指针时,如何进行初始化?感谢
答案 0 :(得分:1)
如果m_Parser没有使用shared_ptr,则无法进行。 shared_ptr不是灵丹妙药,你只能在自己的代码中使用它们。您可以使用.get()方法返回智能指针下的原始指针,以便与遗留代码兼容。