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 回答