Я не могу заставить MPFR (обычная C версия) работать чисто с shared_ptr. Поскольку у меня уже есть код C, я просто хочу иметь небольшую «обертку», которая делает shared_ptr
s из простых C указателей, которые у меня уже есть.
root проблемы I думаю, это определение mpfr_t
как массива размером 1 из __mpfr_struct
в mpfr.h
, что, кажется, вызывает проблемы.
typedef __mpfr_struct mpfr_t[1];
В C Я просто использовал массивы mpfr_t
с указатели без проблем.
mpfr_t* someArr = (mpfr_t*) malloc(someSize*sizeof(mpfr_t))
И я просто хочу обернуть что-то вроде someArr
в shared_ptr
Но теперь, когда я пытаюсь что-то сделать с C ++ и shared_ptr
#include <memory>
#include "mpfr.h"
struct myDeleter{
size_t nn;
myDeleter(size_t nIn){
nn = nIn;
};
void operator()(mpfr_t* ptr){
for (size_t ii = 0; ii < nn; ii++) {
mpfr_clear(ptr[ii]);
};
free(ptr);
};
};
std::shared_ptr<mpfr_t> ptr_to_sptr (mpfr_t* ptr, size_t nn) {
std::shared_ptr<mpfr_t> sp;
myDeleter deleter(nn);
sp.reset(ptr, deleter);
return sp;
};
Я получаю сообщение об ошибке
error: no matching function for call to ‘std::shared_ptr<__mpfr_struct [1]>::reset(__mpfr_struct (*&)[1], myDeleter&)’
, которое, вероятно, вызвано «странным» определением mpfr_t
как массива (работают другие типы данных).
Мне действительно нужно использовать определение, например std::shared_ptr<__mpfr_struct>
или что-то еще, и всегда приводить между моим старым C и новым кодом C ++ или есть что-то, что я упускаю? Почему shared_ptr
просто не принимает mpfr_t
(я использую C ++ 20, который добавил поддержку массивов (например, int[]
) для shared_ptr в других отношениях)?