Nano Hash - криптовалюты, майнинг, программирование

Сохраняйте boost::allocators в качестве членов класса. Может использовать их для инициализации контейнеров

Я хочу поместить в разделяемую память struct1, содержащую вектор struct2, содержащую wstring. Так:

  • Я сделал два распределителя, один для wchar, другой для struct2.
  • Затем определил мои контейнеры wstring и vector.

Я хочу сохранить распределители wchar и struct2 как члены класса, чтобы мне не приходилось хранить ссылку на shm (поскольку мне не нужно создавать их с помощью shm.get_manager() каждый раз, когда я хочу манипулировать данными). Но какую бы конфигурацию я ни использовал, она терпит неудачу.

Теперь я получаю следующую ошибку:

SharedData(InnerDataAllocator eAlloc):data(eAlloc) { 

Ошибка C2664:
'boost::container::vector,void>::vector(const boost::container::vector,void> &)': невозможно преобразовать аргумент 1 из 'InnerDataAllocator' в 'const boost:: контейнер:: new_allocator &'

заголовок.h

typedef bip::allocator<wchar_t, bip::managed_shared_memory::segment_manager> CharAllocator;
typedef bip::basic_string<wchar_t, std::char_traits<wchar_t>, CharAllocator> MyShmString;

class InnerData {
public:
    uint64_t id;
    MyShmString name;
    uint8_t status;
    static const uint8_t defaultStatus = 3;

    InnerData(CharAllocator cAlloc):name(cAlloc) {

    }
};

typedef bip::allocator<InnerData, bip::managed_shared_memory::segment_manager> InnerDataAllocator;
class SharedData {
public:
    int a;
    bool newRequestUntreated = false;
    bool newReplyUntreated = false;

    bip::vector<InnerData> data; 
    SharedData(InnerDataAllocator eAlloc):data(eAlloc) {

    }
};

UsualInnerData{//like InnerData but with normal std::wstring
public:
    uint64_t id;
    std::wstring name;
    uint8_t status;
    static const uint8_t status Default = 3;
};

class Zone {
public:
    SharedData * sharedData;

    CharAllocator     charAllocator;
    InnerDataAllocator   innerDataAllocator;

    void putInShm(const std::vector<UsualInnerData> &in);
    void initializeZone(std::string &_name, std::string &_nameSeg);
    static bool alreadyCreated;
};

код.cpp

void Zone::createNewCheckingZone(std::string &_name, std::string &_nameSeg) {
    if (!alreadyCreated) {
        int size = getOverallSize();
        bip::managed_shared_memory shm(bip::create_only, _name.c_str(), 10000 + size);
        CharAllocator scharAllocator(shm.get_segment_manager());
        swap(charAllocator, scharAllocator); //use of swap because = operator says Not assignable from other allocator

        InnerDataAllocator sinnerDataAllocator(shm.get_segment_manager());
        swap(innerDataAllocator, sinnerDataAllocator);
        sharedData = shm.construct<SharedData>(_nameSeg)(innerDataAllocator);
        alreadyCreated = true;
    }
    return ;
}
void Zone::putInShm(const std::vector<UsualInnerData> &in){
    InnerData newInnerData(charAllocator);
    for (auto a : in) {
        newInnerData.id = a.id;
        newInnerData.name = a.xml.c_str();
        newInnerData.status = InnerData::defaultStatus;
        sharedData->data.push_back(newInnerData);
    }
    return;
}

Поскольку я могу без проблем инициализировать InnerData.name с помощью charAllocator Zone, почему я не могу сделать то же самое, то есть инициализировать SharedData.data с помощью innerDataAllocator Zone?


Ответы:


1

На самом деле, я сделал одну ошибку, (вчера доел свой кофейный пакетик, теперь начинаю это чувствовать), я определил:

typedef  bip::vector<InnerData, InnderDataAllocator> InnerDataVector;

но не использовал его для определения SharedData.data. Вот как я это изменил:

class SharedData {
public:
    int a;
    bool newRequestUntreated = false;
    bool newReplyUntreated = false;
    InnerDataVector data; 
    SharedData(InnerDataAllocator eAlloc):data(eAlloc) {}
};

И теперь он компилируется.

15.03.2019
Новые материалы

Кластеризация: более глубокий взгляд
Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

Как написать эффективное резюме
Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

Частный метод Python: улучшение инкапсуляции и безопасности
Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

Как я автоматизирую тестирование с помощью Jest
Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..


© 2024 nano-hash.ru, Nano Hash - криптовалюты, майнинг, программирование