5

テンプレートに一種のファクトリ クラスを作成しようとしています。純粋な仮想関数のようなことをしたかったのですが、関数を使用して型を作成しているため、静的である必要があります。

私がしたいことは、クラスを宣言するときに、テンプレートが静的関数を呼び出すことです。静的関数は、実際にはテンプレート化されたクラスで宣言されています。

私はこれまでのところ持っています:

class Base
{

};

template<typename T>
class Type : public Base
{
public:
    static void Create()
    {
        mBase = CreateBase();
    }

private:
    static Base* CreateBase();

    static Base* mBase;
};

class MyType : public Type<MyType>
{
private:        
    static Base* CreateBase()
    {
        return new MyType;
    }
};

template<typename T>
Base* Type<T>::mBase = NULL;

void test()
{
    MyType::Create();
}

リンク時エラーが発生します。

undefined reference to `Type<MyType>::CreateBase()
4

2 に答える 2

3

関数はCreateBase基本型で定義されているため、呼び出すだけです。

template<typename T>
class Type : public Base
{
public:
    static void Create()
    {
        mBase = Base::CreateBase();
    }
//...

CreateBaseテンプレートで別のものを宣言する必要はありません。

于 2012-05-14T16:41:12.087 に答える
2

それを見つけた。

問題は、派生クラスの関数を呼び出していなかったことです。

修正は次のとおりです。

static void Create()
{
    mBase = T::CreateBase();
}
于 2012-05-15T08:53:52.070 に答える