Index: src/main/include/log4cxx/helpers/objectptr.h
===================================================================
--- src/main/include/log4cxx/helpers/objectptr.h	(revision 620195)
+++ src/main/include/log4cxx/helpers/objectptr.h	(working copy)
@@ -44,7 +44,7 @@
 			ObjectPtrBase();
 			virtual ~ObjectPtrBase();
             static void checkNull(const int& null);
-            static void* exchange(void** destination, void* newValue);
+            static void* exchangeVoidP(void** destination, void* newValue);
 			virtual void* cast(const Class& cls) const = 0;
         };
 
@@ -113,10 +113,9 @@
              if (newPtr != 0) {
                  newPtr->addRef();
              }
-             T** pp = &p;
-             void* oldPtr = ObjectPtrBase::exchange((void**) pp, newPtr);
+             T* oldPtr = ObjectPtrT::exchange(&p, newPtr);
              if (oldPtr != 0) {
-                 ((T*) oldPtr)->releaseRef();
+                 oldPtr->releaseRef();
              }
             return *this;
          }
@@ -127,10 +126,9 @@
                 //   throws IllegalArgumentException if null != 0
                 //
                 ObjectPtrBase::checkNull(null);
-                T** pp = &p;
-                void* oldPtr = ObjectPtrBase::exchange((void**) pp, 0);
+                T* oldPtr = ObjectPtrT::exchange(&p, (T*)0);
                 if (oldPtr != 0) {
-                   ((T*) oldPtr)->releaseRef();
+                   oldPtr->releaseRef();
                 }
                 return *this;
          }
@@ -139,10 +137,9 @@
               if (p1 != 0) {
                 p1->addRef();
               }
-              T** pp = &p;
-              void* oldPtr = ObjectPtrBase::exchange((void**) pp, p1);
+              T* oldPtr = ObjectPtrT::exchange(&p, p1);
               if (oldPtr != 0) {
-                 ((T*)oldPtr)->releaseRef();
+                 oldPtr->releaseRef();
               }
               return *this;
             }
@@ -182,6 +167,11 @@
 
 
         private:
+            static T* exchange(T** ptr, T* val) {
+                return static_cast<T*>(
+                        ObjectPtrBase::exchangeVoidP((void**)ptr, val) );
+            }
+
             T * p;
 			virtual void* cast(const Class& cls) const {
 				if (p != 0) {
