1

我正在用 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)->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 是哪个类型变量,或者它找不到该类的适当重载构造函数。

4

2 回答 2

2

请张贴您初始化 spIndex 的行。编译器错误“没有类类型”通常意味着您将函数称为字段,在这种情况下,这可能意味着您的编译器以某种方式将 spIndex 误认为函数。我还没有看到代码,但我敢打赌,Most Vexing Parse 会以某种方式出现。

于 2010-04-05T15:37:12.520 回答
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&) {}

考虑到它只是样板代码,我错了...

于 2010-04-06T10:26:11.653 回答