1

私は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);

しかし、スマートポインターを使用する場合、この初期化はどのように行われますか?ありがとう

4

1 に答える 1

2

m_Parserがshared_ptrを受け取らない場合、それを作成することはできません。shared_ptrは特効薬ではなく、独自のコードでのみ使用できます。.get()メソッドを使用して、レガシーコードとの互換性のために、スマートポインターの下に生のポインターを返すことができます。

于 2011-01-07T18:55:50.170 に答える