普通のクラスにテンプレートフレンド機能が必要だと思います。この関数は、共有メモリで複雑な割り当てを行ったり、ハードウェアや OS を調べたりします。しかし、問題が -template- および/または -friend- の側面に関連しており、より邪悪なものではないことを示すために、私はそのすべてを除外しました. 主な部分は、クラスのインスタンスとそのメンバー データをすべて、ジェネリック パラメーターとして渡すことができるアロケーターで割り当てる必要があるということです。
class Foo {
public:
const long * const larry;
const long * const curly;
const long * const moe;
private:
Foo() : larry(0), curly(0), moe(0) {}; // not used
Foo(long * _larry, long * _curly, long * _moe) :
: larry(_larry), curly(_curly), moe(_moe)
{
// some unrelated memory management and OS stuff happens here
}
template<class Alloc> friend const Foo * alloc_Foo(long count);
public: // factories
template<class Alloc> const Foo * factory_A(long);
// template<class Alloc> const Foo * factory_B(long);
// ...
// template<class Alloc> const Foo * factory_G(long);
};
template<class Alloc> const Foo * alloc_Foo(long count)
{
typename Alloc::template rebind<long>::other a_long;
// allocate internal parts in shared memory
const long * const larry = a_long.allocate(count+2);
const long * const curly = a_long.allocate(count+44);
const long * const moe = a_long.allocate(count*3);
Alloc alloc;
const Foo * const p_foo = alloc.allocate(1);
alloc.construct(p_foo, Foo(larry, curly, moe));
);
これが正しい解決策であるべきだと思います。alloc_Foo のみがコンストラクターを呼び出す必要があり、ファクトリ メソッドのみが alloc_Foo を呼び出す必要があります。Foo のインスタンスとその個別に割り当てられた内部パーツは、本来あるべき共有メモリに作成され、すべての複雑な割り当ては alloc_Foo フレンド テンプレートに隠されます。この部分は問題なく動作します。alloc_Foo の実装は短くて単純なので、同じファイルに実装してもかまいません。しかし、alloc_Foo を呼び出すファクトリは大規模で複雑であり、クリーンで単純なクラスが数十のインクルードと数百行のコードで乱雑になります。
各ファクトリを個別のファイルに入れることができるように、最後に実装を含めようとしました。
#include "factory_A.tpp"
#include "factory_B.tpp"
// etc.
次に、.tpp ファイルに実際のコードを入れましたが、bar.h など、何も含めることができないようです。#include ルールは崩壊しているようです。テンプレート アロケータの友人と何か関係があるのではないかと心配しています。他の多くの問題を解決してくれるので、それを失うのは絶対に嫌です。
../blah/blah/factory_A.tpp:10:9: error: 'Bar' was not declared in this scope
make: *** [blah/blah/main.o] Error 1
通常、私はスコープ取引にそれほどこだわることはありませんが、これは私にとって珍しい組み合わせです. 多分私は取引全体を考えすぎています。alloc_Foo は、私が隠しているコンストラクターを見ることができるように、友人でなければならないと考えています。私は、これも非公開にする必要があり、工場だけが使用できるようにする必要があると考えています。アロケーターとファクトリーの両方が実際には関数の一部ではないと私は考えています。彼らは「これ」を持っていないか、必要としません。多分それらは静的であるべきです。多くの内部パーツと各インスタンスの実際のオブジェクト自体で特別なアロケーターを使用する必要があるため、テンプレートである必要があると考えています。静的である必要があります。
誰でも助けることができますか?
ありがとう。