Technical reason:
Since the new version of log4cxx uses std::shared_ptr(instead of the
homegrown smart pointer solution), you need to slightly modify your code to
work.  The reason for the shared_ptr is that it's standard, and it fixes
some bugs with regards to reference counting.  The original homegrown
solution was implicitly convertible to/from a pointer; shared_ptr is not.

Create a typedef for your appender using the LOG4CXX_PTR_DEF macro:

LOG4CXX_PTR_DEF(ROSConsoleStdioAppender)

Then just create a new shared_ptr with your typedef:

ROSConsoleStdioAppenderPtr(new ROSConsoleStdioAppender());

-Robert Middleton

On Sun, Aug 15, 2021 at 5:37 AM Achmad Fathoni <fathoni...@gmail.com> wrote:

> This sample program can be compiled with 0.11.0 but not 0.12.0. The error
> is "Cannot convert ‘ROSConsoleStdioAppender*’ to ‘log4cxx::App
> enderPtr’ {aka ‘std::shared_ptr<log4cxx::Appender>’}". What change do I
> need to make it works with 0,12.0? Thank you.
>
> #include <log4cxx/log4cxx.h>
> #include <log4cxx/basicconfigurator.h>
> #include <log4cxx/helpers/exception.h>
> #include <log4cxx/logger.h>
> #include <log4cxx/level.h>
> #include <log4cxx/appenderskeleton.h>
>
> using namespace log4cxx;
> using namespace log4cxx::helpers;
>
> class ROSConsoleStdioAppender : public log4cxx::AppenderSkeleton
> {
> public:
>   ~ROSConsoleStdioAppender()
>   {
>   }
>
> protected:
>   virtual void append(const log4cxx::spi::LoggingEventPtr& event,
>                       log4cxx::helpers::Pool&)
>   {
>   }
>
>   virtual void close()
>   {
>   }
>
>   virtual bool requiresLayout() const
>   {
>     return false;
>   }
> };
>
> int main(){
>     LoggerPtr logger(Logger::getLogger("main"));
>     logger->addAppender(new ROSConsoleStdioAppender);
>     return 0;
> }
>

Reply via email to