mardi 10 septembre 2019

shared_ptr to a vector with custom allocator

I have a class which has shared_ptr to a std::vector as one of it's member variables - > std::shared_ptr<std::vector<T> > m_buffer;. This Was working fine. Now I wrote a custom allocator following this link which in its base stripped down form looks something like this -

class Allocator {
public : 
    //    typedefs
    typedef T value_type;
    typedef value_type* pointer;
    typedef const value_type* const_pointer;
    typedef value_type& reference;
    typedef const value_type& const_reference;
    typedef std::size_t size_type;
    typedef std::ptrdiff_t difference_type;

public : 
    //    convert an allocator<T> to allocator<U>
    template<typename U>
    struct rebind {
        typedef Allocator<U> other;
    };

public : 
    inline explicit Allocator() {}
    inline ~Allocator() {}
    inline explicit Allocator(Allocator const&) {}
    template<typename U>
    inline explicit Allocator(Allocator<U> const&) {}

    //    address
    inline pointer address(reference r) { return &r; }
    inline const_pointer address(const_reference r) { return &r; }

    //    memory allocation
    inline pointer allocate(size_type cnt, 
       typename std::allocator<void>::const_pointer = 0) { 
      return reinterpret_cast<pointer>(::operator new(cnt * sizeof (T))); 
    }
    inline void deallocate(pointer p, size_type) { 
        ::operator delete(p); 
    }

    //    size
    inline size_type max_size() const { 
        return std::numeric_limits<size_type>::max() / sizeof(T);
 }

    //    construction/destruction
    inline void construct(pointer p, const T& t) { new(p) T(t); }
    inline void destroy(pointer p) { p->~T(); }

    inline bool operator==(Allocator const&) { return true; }
    inline bool operator!=(Allocator const& a) { return !operator==(a); }
};    //    end of class Allocator 

Now, when I change my member variable to std::shared_ptr<std::vector<T, opencl::Allocator<T>> > m_buffer;, it throws an error - no matching function for call to ‘std::__shared_ptr<std::vector<float, nie::opencl::Allocator<float, nie::opencl::OpenCLAllocPolicy<float>, nie::opencl::AllocatorInstance<float> > >, (__gnu_cxx::_Lock_policy)2u>::__shared_ptr(std::remove_reference<std::__shared_ptr<std::vector<float, std::allocator<float> >, (__gnu_cxx::_Lock_policy)2u>&>::type)’ __shared_ptr(std::move(__r)).swap(*this);

I don't know how to resolve this. Kindly help.

Aucun commentaire:

Enregistrer un commentaire