Xerces-c & shared_ptrs - PullRequest
       12

Xerces-c & shared_ptrs

0 голосов
/ 07 января 2011

Я новичок в концепции 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 &) '/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);

Но как использовать эту инициализацию при использовании умных указателей?Спасибо

1 Ответ

1 голос
/ 07 января 2011

Если m_Parser не принимает shared_ptr, вы не можете это сделать.shared_ptr - не серебряная пуля, вы можете использовать их только в своем коде.Вы можете использовать метод .get () для возврата необработанного указателя под умным указателем для совместимости с устаревшим кодом.

...