1

出力にポリシーを使用するテンプレートクラスと、データメンバーのタイプを決定する別のテンプレート引数があります。さらに、コンストラクターは、プライベートポインターに格納されている基本クラスへのポインターを受け取ります。このオブジェクトの関数は、テンプレートクラスへのthisポインターを取得して、データへのアクセスを許可します。コードでは、これは次のようになります。

class ShapeGenerator;

template <typename PointData, typename OutputPolicy> class ModelCreator {
private:
    OutputPolicy output;
    ShapeGenerator* shape
    std::vector<PointData> data;
public:
    ModelCreator (ShapeGenerator *s) : shape(s) { }
    void createShape() { shape->generateShape(this); }
};

ShapeGeneratorはインターフェースであり、実装する必要があります。次のようになります。

class ShapeGenerator {
public:
    void generateShape (ModelCreator* m) = 0;
};

これをg++4.3.4(cygwin)でコンパイルすると、ShapeGenerator::generateShapeでエラーが発生します'ModelCreater' is not a type。ModelCreatorの前方宣言を入れましたが、何も変わりませんでした。タイプとパラメーターのいくつかの組み合わせを試してみました。たとえば、ベクトルのみを渡すと、不完全なタイプについて何かを示すエラーメッセージが表示されました。これがここでの問題だと思います。

それで、特定の議論なしでテンプレート化されたタイプを渡すことは可能ですか?もしそうなら、どのように?

編集: 私はModelCreatorタイプ名に縛られていません。もっとテンプレートを書かなければならない場合-これは問題ではありません。ただし、ShapeCreatorオブジェクトでModelCreatorのタイプを指定したくありません。それは可能ですか?

edit2:わかりまし た、私はこの「デザイン」について少し楽観的だったと思います。いくつかの材料を投入してスープを手に入れるだけでよかったでしょう。しかし今、塩は鍋の中の水の種類を知らなければなりません。テンプレートをプレーンな古い構成に変更します。みんなありがとう。

4

2 に答える 2

3

ModelCreator「無料」のテンプレートパラメータを使用する場合はShapeGenerator、テンプレートも作成する必要があります。

template <typename PointData, typename OutputPolicy> 
class ShapeGenerator {
public:
    void generateShape (ModelCreator<PointData,OutputPolicy>* m) = 0;
};

また

template <template <typename, typename> class ModelCreator> 
class ShapeGenerator {
public:
    void generateShape (ModelCreator* m) = 0;
};

2番目のバージョンは、パラメーターとして別のテンプレートを取ります。次のように使用します。

ShapeGenerator<ModelCreator<PointDataType,OutPutPolicyType> > shapeGenerator; 
于 2010-07-09T15:55:54.057 に答える
1

ShapeGenerateをテンプレートクラスにする必要もあります。

template <typename PointData, typename OutputPolicy>
class ShapeGenerator;

template <typename PointData, typename OutputPolicy>
class ModelCreator {
private:
    OutputPolicy output;
    ShapeGenerator< PointData, OutputPolicy >* shape;    
    std::vector<PointData> data;
public:
    ModelCreator (ShapeGenerator< PointData, OutputPolicy >* s) : shape(s) { }
    void createShape();
};

template <typename PointData, typename OutputPolicy>
class ShapeGenerator {
public:
    void generateShape (ModelCreator< PointData, OutputPolicy> * m) = 0;
};

template <typename PointData, typename OutputPolicy>
void ModelCreator< PointData, OutputPolicy >::createShape() { shape->generateShape(this); }
于 2010-07-09T15:57:01.450 に答える