карты памяти STL с общей памятью - PullRequest
1 голос
/ 01 апреля 2010

Я пишу модуль Apache на C ++. Мне нужно хранить общие данные, которые должны прочитать все дети, как часть общей памяти. Структура - это своего рода карта векторов, поэтому я хочу использовать карту STL и векторы для нее. Я написал общий распределитель и общий менеджер для этой цели, они отлично работают для векторов, но не для карт, ниже приведен пример:

typedef vector<CustomersData, SharedAllocator<CustomersData> > CustomerVector;
CustomerVector spData;    //this one works fine

typedef SharedAllocator< pair< const int, CustomerVector > > PairAllocator;

typedef map<int, CustomerVector, less<int>, PairAllocator > SharedMap;

SharedMap spIndex;    //this one doesn't work<

Я получаю ошибки во время компиляции, когда пытаюсь использовать второй объект (spIndex), который выглядит примерно так:

.. / SpatialIndex.h: 97: ошибка: '((SpatialIndex *) this) -> SpatialIndex :: spIndex' не имеет типа класса

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

Вы можете помочь?

Спасибо Бенвенуто

Здравствуйте, спасибо за ваши комментарии.

SpatialIndex - это класс, который содержит контейнер, он в основном создается контейнером (SharedMap spIndex; является членом SpatialIndex) и двумя методами update и getData.

При методе обновления следующая строка кода выдает ошибку компилятора, приведенную выше:

int spKey = this->calculateSpKey( customer.getLat(), customer.getLong() );
this->spIndex[spKey].push_back(customer);

Изменение синтаксиса последней строки изменяет ошибку, которую дает компилятор, но в основном он говорит, что не может понять, какая переменная типа spIndex, или что он не может найти подходящий конструктор перегрузки для этого класса.

Ответы [ 2 ]

2 голосов
/ 05 апреля 2010

Пожалуйста, опубликуйте строку, в которой вы инициализируете spIndex. Ошибка компилятора «не имеет типа класса» обычно означает, что вы ссылаетесь на функцию, как если бы это было поле, что в данном случае, вероятно, означает, что ваш компилятор каким-то образом принял spIndex за функцию. Я не видел код, но держу пари, что самый мексиканский парс как-нибудь появится.

0 голосов
/ 06 апреля 2010

большое спасибо за помощь, строка инициализации была действительно

SharedMap spIndex( less<int>(), PairAllocator );

, который был интерпретирован компилятором как функция, которая принимает два параметра и возвращает объект SharedMap, что приводит ко всем вышеуказанным проблемам. Изменение этой строки на:

SharedMap spIndex;

Приводит к более неустранимой ошибке, типа «не удается найти подходящий конструктор для того объекта stl_tree, который внутренне управляет stl :: map».

Эта другая ошибка была устранена путем удаления «явного» слова из следующих строк в SharedAllocator.h

inline explicit SharedAllocator(SharedAllocator const&) {}

template<typename U>
inline explicit SharedAllocator(SharedAllocator<U> const&) {}

что я ошибался, учитывая, что это всего лишь шаблонный код ...

...