私のプロジェクトのテンプレートファクトリを作成しています。オブジェクト作成プロセスに余分なパラメータを追加する必要があるまで、すべてうまくいきました。リンカエラーが発生し、参照型が無視されるテンプレートファクトリ
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コピーですが、参照を使用します。
アイデア?
ありがとうございました。実際に私はこのコードを組み込み、少しシンプルにして問題を修正しました。これはあなたが見つけた問題によって実際に引き起こされました。 – bcsanches