我正在用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是哪个类型变量,或者它无法为此类找到合适的重载构造函数。
答案 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&) {}
我认为它只是样板代码而错了...