【发布时间】:2012-05-14 19:47:21
【问题描述】:
我在使用 C++ 模板时遇到问题。以下是我正在尝试做的事情的解释,以便每个人都可以更好地理解我的问题。
我的框架有一个基类Component,我的框架的用户将派生Component 以创建具体的Components,例如TransformComponent 和AudioComponent。 ComponentComposite 存储给定用户创建的所有具体 Components 的列表。
我正在尝试通过boost::any 和boost::any_casts 存储具体Components 的列表。
以下是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。我正在尝试将两个Components 添加到GameObject,然后我尝试访问添加的两个Components。这样做将是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(); 的源代码
【问题讨论】:
-
您的模板化方法是否在标头中定义?
-
戴夫,我对你在问什么感到困惑。我为
ComponentComposite提供的代码是我的标题的片段。我为GameObject提供的代码只是一个示例构造函数 -
既然你所有的具体组件类都派生自
Component,为什么要使用boost::any?为什么不直接使用指向Component的指针列表,并使用dynamic_cast<>在ComponentComposite::getComponent()中按类型查找组件? -
C++ 的
dynamic_cast<>要求类是多态的。Component没有任何virtual方法,因此不是多态的。除非我误解了dynamic_cast<>,否则我认为该解决方案不会奏效。
标签: c++ templates boost unity3d