我在使用C++模板时遇到问题。这里是我正在尝试做的解释,以便每个人都可以更好地了解我的问题。
我的框架有一个基类Component
,我的框架的用户将派生Component
来创建具体的Components
,例如TransformComponent
和AudioComponent
。 ComponentComposite
存储给定用户创建的所有具体Component
的列表。
我正在尝试通过Components
和boost::any
来存储具体boost::any_cast
的列表。
以下是ComponentComposite
和我的boost::any
列表中的两种方法。
class ComponentComposite {
public:
ComponentComposite();
template<class T> bool addComponent(T* component);
template<class T> T* getComponent();
private:
QList<boost::any*>* m_components;
}
这是
GameObject
的示例代码,它是ComponentComposite
。我试图将两个Component
添加到GameObject
,然后尝试访问添加的两个Component
。这样做是ComponentComposite
的常见用例。 GameObject::GameObject() : ComponentComposite()
{
addComponent<Components::AudioComponent>(new Components::AudioComponent());
addComponent<Components::TransformComponent>(new Components::TransformComponent());
Components::TransformComponent* transform= getComponent<Components::TransformComponent>();
Components::AudioComponent* audio= getComponent<Components::AudioComponent>();
}
这样做会引发四个错误(每个函数调用一个):
...undefined reference to `bool BalaurEngine::Composites::ComponentComposite::addComponent<BalaurEngine::Components::AudioComponent>(BalaurEngine::Components::AudioComponent*)'
...undefined reference to `bool BalaurEngine::Composites::ComponentComposite::addComponent<BalaurEngine::Components::TransformComponent>(BalaurEngine::Components::TransformComponent*)'
...undefined reference to `BalaurEngine::Components::TransformComponent* BalaurEngine::Composites::ComponentComposite::getComponent<BalaurEngine::Components::TransformComponent>()'
...undefined reference to `BalaurEngine::Components::AudioComponent* BalaurEngine::Composites::ComponentComposite::getComponent<BalaurEngine::Components::AudioComponent>()'
如果有人愿意,我可以发布方法
template<class T> bool addComponent(T* component);
和template<class T> T* getComponent();
的源代码 最佳答案
现在已回答-查看最后一条评论:
@Mutmansky,我没有意识到C++中已实现的模板化功能必须与模板化功能的定义一起放在 header 中。在执行完此操作后,按照Scott Langham的建议,编译器错误消失了。如果您想查看该文件的源代码,我很乐意将其发布在此处/向您发送消息。让我知道!
关于c++ - 如何指定C++类的特定方法使用模板?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/10462830/