如何对一个shared_ptr数组使用qsort?

Preface:这是在抄Ray Tracing The Next Week的时候遇到的问题。BVH那一章的排序,作者用的是二级指针,我觉得挺难看,于是打算用STL容器改写一下,在改写的过程中碰到了该情况。

class Data
{
public:
        Data(int _i)
        :i(_i)
        {}
        
        int i;
}
int main()
{
    std::vector<std::shared_ptr<Data>> v;
    v.push_back(std::make_shared<Data>(3));
    v.push_back(std::make_shared<Data>(2));
    v.push_back(std::make_shared<Data>(1));

    std::qsort(&v[0],v.size(),sizeof(std::shared_ptr<Data>),
    [](const void* a,const void* b)->int
    {
        std::shared_ptr<Data> temp_a=*((std::shared_ptr<Data>*)a);
        std::shared_ptr<Data> temp_b=*((std::shared_ptr<Data>*)b);

        if(temp_a->i<temp_b->i)
        {
            return -1;
        }
        else
        {
            return 1;
        }
    });

    return 0;
}

作为一个记录。