-1

普通のクラスにテンプレートフレンド機能が必要だと思います。この関数は、共有メモリで複雑な割り当てを行ったり、ハードウェアや 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 は、私が隠しているコンストラクターを見ることができるように、友人でなければならないと考えています。私は、これも非公開にする必要があり、工場だけが使用できるようにする必要があると考えています。アロケーターとファクトリーの両方が実際には関数の一部ではないと私は考えています。彼らは「これ」を持っていないか、必要としません。多分それらは静的であるべきです。多くの内部パーツと各インスタンスの実際のオブジェクト自体で特別なアロケーターを使用する必要があるため、テンプレートである必要があると考えています。静的である必要があります。

誰でも助けることができますか?

ありがとう。

4

1 に答える 1

0

これはテンプレートや友達とは何の関係もないと確信しています。プリプロセッサはテンプレートやフレンドについて何も知りません。ファイルを開いてその内容を他のファイルに挿入するだけです。テンプレートとフレンドは「インクルード ルールをバラバラにする」ことはできません。あなたがしていることはうまくいくはずです。

のインクルード ガードを確認してください。bar.hそれらは他のファイルと同じですか?

いくつか#include "factory_A.tpp"の名前空間スコープが開いている間にしましたか? ファイルの下部にある余分なインクルードの前に名前空間を閉じてみてください。

またはBar、いくつかの名前空間にあり、あなたは言うべきx::Barですか?

あなたは間違って拾っていbar.hますか?ヘッダー ファイルの名前を別の名前に変更してみてください。これは、他のヘッダーが呼び出されないようにするためのものであり、その名前に変更し#includeてください。

これらのいずれも機能しない場合は、問題を再現する最小限の完全な例にコードを減らします。現在、実際の問題がどこにあるかを確認するのに十分なコードが表示されていませんが、それはほとんどの場合、あなたが提案したものではなく、表示されていないコードの別の場所にあります。

于 2013-01-08T02:00:45.333 に答える