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<

2 番目のオブジェクト (spIndex) を使用しようとすると、次のようなコンパイル エラーが発生します。

../SpatialIndex.h:97: エラー: '((SpatialIndex*)this)->SpatialIndex::spIndex' にクラス型がありません

コンパイラが SharedMap テンプレート タイプのタイプを判別できないように見えますが、これは私の意見では奇妙です。すべてのテンプレート パラメータが指定されているように思えます。

手伝ってくれますか?

ありがとうベンヴェヌート

こんにちは、コメントありがとうございます。

SpatialIndex はコンテナを含むクラスで、基本的にはコンテナ (SpatialIndex のメンバーである SharedMap spIndex) と 2 つのメソッド update と getData によって作成されます。

update メソッド内で、次のコード行で上記のコンパイラ エラーが発生します。

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

最後の行の構文を変更すると、コンパイラが与えるエラーが異なりますが、基本的には、どの型変数 spIndex が理解できないか、このクラスの適切なオーバーロード コンストラクターが見つからないことを示しています。

4

2 に答える 2

2

spIndex を初期化する行を投稿してください。コンパイラ エラー 'does not have class type' は、通常、関数をフィールドであるかのように参照していることを意味します。この場合、コンパイラが何らかの形で spIndex を関数と間違えたことを意味します。コードは見ていませんが、Most Vexing Parse が何らかの方法で登場することは間違いありません。

于 2010-04-05T15:37:12.520 に答える
0

助けてくれてありがとう、初期化行は確かに

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

これはコンパイラによって、2 つのパラメーターを取り、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 に答える