0

私はそのようなクラスのパブリックエリアで次のメソッドを宣言しています:

ヘッダーファイル:

class EntityManager
{
    public:
        ...
        template <typename ComponentType>
        bool addComponentToEntity(const Entity in_Entity, const shared_ptr<ComponentType> in_ComponentInstance);
        ...
}

ソースファイル:

template <typename ComponentType>
bool EntityManager::addComponentToEntity(const Entity in_Entity, const shared_ptr<ComponentType> in_ComponentInstance)
{
    ...
}

それから私はそれをこのように使おうとします:

Entity l_Entity = 1;
shared_ptr<TestComponent> l_TestComponent(new TestComponent());
EntityManager* l_EntityManager = new EntityManager();

l_EntityManager->addComponentToEntity<TestComponent>(l_Entity, l_TestComponent);

これにより、コンパイラは次のように文句を言います。

undefined reference to `bool EntityManager::addComponentToEntity<TestComponent>(unsigned long, boost::shared_ptr<TestComponent>)'|

これはおそらくC++プログラミングの経験があまりないためだと思いますが、関数が未定義である理由がわかりません。EntityManagerクラスの他の関数を呼び出し、完全に機能する他のコードをいくつか省略しました。

また、通常のポインター、参照を使用して関数を書き直し、同じ結果で値を渡すことも試みました。

4

1 に答える 1

1

テンプレートメソッド/関数は、ヘッダー自体で定義する必要があります(メソッドのクラス自体がソースファイルで定義されている場合を除く)。これは、テンプレートクラスのすべてのメソッドにも当てはまります(メソッド自体がテンプレートメソッドでない場合でも)。

ほとんどの人は、クラス定義の下でそれらを定義することさえ気にせず、クラス内でインラインで定義するだけです。

class EntityManager 
{ 
    public: 
        ... 
        template <typename ComponentType> 
        bool addComponentToEntity(const Entity in_Entity, const shared_ptr<ComponentType> in_ComponentInstance)
        {
            ...
        }
        ... 

}

于 2012-09-18T02:43:44.133 に答える