diff --git a/src/mempool.hpp b/src/mempool.hpp
index 212a80f4825d460e3caed7d88b91af2a4ff741e8..44f0fd64398509132a1dfef917540a3f8fd6de77 100644
--- a/src/mempool.hpp
+++ b/src/mempool.hpp
@@ -50,6 +50,12 @@ namespace PYGPU_PACKAGE
     mp_noncopyable& operator=(const mp_noncopyable&) = delete;
   };
 
+#ifdef PYGPU_PYCUDA
+#define PYGPU_SHARED_PTR boost::shared_ptr
+#else
+#define PYGPU_SHARED_PTR std::shared_ptr
+#endif
+
   template <class T>
   inline T signed_left_shift(T x, signed shift_amount)
   {
@@ -339,8 +345,10 @@ namespace PYGPU_PACKAGE
       bool try_to_free_memory()
       {
         // free largest stuff first
-        for (bin_pair_t &bin_pair: reverse(m_container))
+        for (typename container_t::reverse_iterator it = m_container.rbegin();
+            it != m_container.rend(); ++it)
         {
+          bin_pair_t &bin_pair = *it;
           bin_t &bin = bin_pair.second;
 
           if (bin.size())
@@ -392,14 +400,14 @@ namespace PYGPU_PACKAGE
       typedef typename Pool::size_type size_type;
 
     private:
-      std::shared_ptr<pool_type> m_pool;
+      PYGPU_SHARED_PTR<pool_type> m_pool;
 
       pointer_type m_ptr;
       size_type m_size;
       bool m_valid;
 
     public:
-      pooled_allocation(std::shared_ptr<pool_type> p, size_type size)
+      pooled_allocation(PYGPU_SHARED_PTR<pool_type> p, size_type size)
         : m_pool(p), m_ptr(p->allocate(size)), m_size(size), m_valid(true)
       { }