共享内存STL映射

时间:2010-04-01 14:49:40

标签: c++ stl map shared-memory allocator

我正在用C ++编写Apache模块。我需要将所有孩子需要读取的公共数据存储为共享内存的一部分。结构是一种向量的映射,所以我想使用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) - &gt; SpatialIndex :: spIndex'没有类类型

看起来编译器无法确定SharedMap模板类型的类型,这在我看来很奇怪,在我看来,所有的模板参数都已经指定。

你能帮忙吗?

由于 本韦努托

您好,感谢您的评论。

SpatialIndex是包含容器的类,它基本上由容器(SharedMap spIndex;它是SpatialIndex的成员)和两个方法update和getData构成。

在更新方法中,以下代码行给出了上面的编译器错误:

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

改变最后一行的sintax会改变编译器给出的错误,但基本上它表示它无法理解spIndex是哪个类型变量,或者它无法为此类找到合适的重载构造函数。

2 个答案:

答案 0 :(得分:2)

请发布初始化spIndex的行。编译器错误'没有类类型'通常意味着你指的是一个函数,好像它是一个字段,在这种情况下,这可能意味着你的编译器错误地为某个函数设置了spIndex。我还没有看到代码,但我敢打赌,最不知情的Parse会以某种方式出现。

答案 1 :(得分:0)

非常感谢帮助,初始化线确实是

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

由编译器解释为接受两个参数并返回SharedMap对象的函数,从而导致上述所有问题。将此行更改为:

SharedMap spIndex;

导致更难以理解的错误,有些'无法为内部管理stl :: map'的stl_tree对象找到合适的构造函数。

解决了另一个错误,删除了SharedAllocator.h中以下行中的“显式”单词

inline explicit SharedAllocator(SharedAllocator const&) {}

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

我认为它只是样板代码而错了...