I'm having trouble getting (Windows) MFC or ATL CStrings to log
properly, when using the LOG4CXX_* macros.  For example, this will log
the pointer's hex value, rather than the string contents:

CString sMyString(_T("Test CString"));
LOG4CXX_DEBUG(MyLogger, sMyString);

CString does implement a cast operator to LPCTSTR (wchar_t* in my case).
If I explicitly call this, the string logs properly:

CString sMyString(_T("Test CString"));
LOG4CXX_DEBUG(MyLogger, (LPCTSTR)sMyString);

I would expect this cast operator to be implicitly called inside
MessageBuffer, to make the argument comply with the function signature.
I think this is the function that should be called:

WideMessageBuffer& MessageBuffer::operator<<(const wchar_t* msg);

But when I step through in the debugger, I see that there is a global
cast operator called instead.  I assume it's a better fit, as far as the
compiler's concerned:

template<class V>
std::ostream& operator<<(MessageBuffer& os, const V& val) {
   return ((std::ostream&) os) << val;

I tried commenting this cast operator out, and then I no longer have to
cast my CString!  But I'm afraid this was probably put in for a reason,
and I hate to just hack something when I don't completely understand it.
Does anyone know if I can safetly remove this?  Looking at the change
list, I see it was added by "carnold" on 11/6/07, revision number
592542.

I'm using the last snapshot before the 0.10 release, by the way.

Any help would be appreciated.

Thanks!
Mike

Reply via email to