2011-06-17 22 views
1

私のプロジェクトのテンプレートファクトリを作成しています。オブジェクト作成プロセスに余分なパラメータを追加する必要があるまで、すべてうまくいきました。リンカエラーが発生し、参照型が無視されるテンプレートファクトリ

template <typename T> 
class GenericFactory_c: boost::noncopyable 
{ 
    public: 
      typedef typename T::ObjectType_t ObjectType_t; 

      //basic creating with just 1 parameter (object name) 
      ObjectType_t Create(const String_c &className, const String_c &name) const 
      { 
       typename ObjectCreatorSet_t::const_iterator it = setObjectCreators.find(className, ObjectCreatorComp_s<T>()); 
       if(it == setObjectCreators.end()) 
        PH_RAISE(OBJECT_NOT_FOUND_EXCEPTION, "[EntityFactory_c::Create]", name); 

       return it->Create(name); 
      } 

      //"advanced" creation using an additional Y parameter 
      template <typename Y> 
      ObjectType_t Create(const String_c &className, const String_c &name, Y param) const 
      { 
       typename ObjectCreatorSet_t::const_iterator it = setObjectCreators.find(className, ObjectCreatorComp_s<T>()); 
       if(it == setObjectCreators.end()) 
        PH_RAISE(OBJECT_NOT_FOUND_EXCEPTION, "[EntityFactory_c::Create]", name); 

       return it->Create(name, param); 
      } 

      //rest of the code, probably irrelavent to the problem removed for clarity 
}; 

アイデアは、特定のタイプのために、唯一の唯一の3つのパラメータが使用されて作成し、他のタイプのために、使用される2つのパラメータを作成することです:

工場は、主に2つのテンプレートがあります。

つまり、あるFactoryインスタンシエーションでは、両方のバージョンが使用されることはありません。

template <typename T, typename Y> 
class ObjectCreatorBase_c: public ObjectCreatorAutoUnlinkHook_t 
{ 
    public: 
     typedef T ObjectType_t; 
     typedef Y ObjectCreatorProc_t; 

    public: 
     ObjectCreatorBase_c(const String_c &name, ObjectCreatorProc_t proc): 
      strName(name), 
      pfnCreateProc(proc) 
     { 
     } 

     T Create(const String_c &name) const 
     { 
      return pfnCreateProc(name); 
     } 

     template <typename Z> 
     T Create(const String_c &name, Z param) const 
     { 
      return pfnCreateProc(name, param); 
     } 

    //"irrelevant" code removed 

     private: 
      String_c strName; 
      ObjectCreatorProc_t pfnCreateProc; 
}; 

そしてコンストラクタ(文字列や実体参照の2つのパラメータを必要とするEntityComponentタイプのために:

は、静的変数を使用して自動登録型にできることについては、私は次のようにこれが定義され、ObjectCreatorクラスを作成しました

static ObjectCreator1_c<EntityComponentPtr_t, Entity_c &> CreatorForXYZ_CreatorObject_gl("XYZ", &XYZ::Create); 
:リアクション

template <typename T, typename Y> 
class ObjectCreator1_c: public ObjectCreatorBase_c<T, T(*)(const String_c &, Y)> 
{  
    public: 
     ObjectCreator1_c(const String_c &name, ObjectCreatorProc_t proc): 
      ObjectCreatorBase_c(name, proc)    
     {    
      GenericFactory_c<ObjectCreator1_c >::GetInstance().Register(*this); 
     } 
}; 

とクリエータが定義されます。)私は以下のようにオブジェクトの作成者を定義します

Entity_c::CreateCompXYZ() 
{ 
    EntityComponentFactory_c &factory = EntityComponentFactory_c::GetInstance(); 

    EntityComponentPtr_t xyz = factory.Create("XYZ", "myXYZInstance", *this); 
} 

そして最後に私の問題は、上記のコードで、来る:私は以下のコードを使用してコンポーネントを作成するために、最終的には

typedef GenericFactory_c<ObjectCreator1_c<EntityComponentPtr_t, Entity_c &> > EntityComponentFactory_c; 

そして:10

このため工場が同様に定義されていますコンパイラは*thisへの参照を無視して、Entityオブジェクトのコピーを作成しようとしています。​​にはコピーコンストラクタ(コピー不可能)がないため、Entity_c::Entity_c(const Entity_c &)という未定義参照があります。このコードは試してみる予定はありませんoコピー​​ですが、参照を使用します。

アイデア?

答えて

1

この機能

Entity_c::CreateCompXYZ() 
{ 
    EntityComponentFactory_c &factory = EntityComponentFactory_c::GetInstance(); 

    EntityComponentPtr_t xyz = factory.Create("XYZ", "myXYZInstance", *this); 
} 

は実際にそれが本当にCreate

//"advanced" creation using an additional Y parameter 
template <typename Y> 
ObjectType_t Create(const String_c &className, const String_c &name, Y param) const 

3パラメータに、このテンプレートを呼び出している場合は、(それがここYある)​​をコピーしようとしているです。

もちろん、コピーできない場合、これは機能しません!

+0

ありがとうございました。実際に私はこのコードを組み込み、少しシンプルにして問題を修正しました。これはあなたが見つけた問題によって実際に引き起こされました。 – bcsanches

関連する問題