【问题标题】:How does one specify that a specific method of a C++ class uses templates?如何指定 C++ 类的特定方法使用模板?
【发布时间】:2012-05-14 19:47:21
【问题描述】:

我在使用 C++ 模板时遇到问题。以下是我正在尝试做的事情的解释,以便每个人都可以更好地理解我的问题。

我的框架有一个基类Component,我的框架的用户将派生Component 以创建具体的Components,例如TransformComponentAudioComponentComponentComposite 存储给定用户创建的所有具体 Components 的列表。

我正在尝试通过boost::anyboost::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>();
    }

这样做会引发四个错误(每个函数调用一个):

  1. ...undefined reference to `bool BalaurEngine::Composites::ComponentComposite::addComponent&lt;BalaurEngine::Components::AudioComponent&gt;(BalaurEngine::Components::AudioComponent*)'
  2. ...undefined reference to `bool BalaurEngine::Composites::ComponentComposite::addComponent&lt;BalaurEngine::Components::TransformComponent&gt;(BalaurEngine::Components::TransformComponent*)'
  3. ...undefined reference to `BalaurEngine::Components::TransformComponent* BalaurEngine::Composites::ComponentComposite::getComponent&lt;BalaurEngine::Components::TransformComponent&gt;()'
  4. ...undefined reference to `BalaurEngine::Components::AudioComponent* BalaurEngine::Composites::ComponentComposite::getComponent&lt;BalaurEngine::Components::AudioComponent&gt;()'

如果有人愿意,我可以发布我的方法 template&lt;class T&gt; bool addComponent(T* component);template&lt;class T&gt; T* getComponent(); 的源代码

【问题讨论】:

  • 您的模板化方法是否在标头中定义?
  • 戴夫,我对你在问什么感到困惑。我为ComponentComposite 提供的代码是我的标题的片段。我为GameObject 提供的代码只是一个示例构造函数
  • 既然你所有的具体组件类都派生自Component,为什么要使用boost::any?为什么不直接使用指向Component 的指针列表,并使用dynamic_cast&lt;&gt;ComponentComposite::getComponent() 中按类型查找组件?
  • C++ 的dynamic_cast&lt;&gt; 要求类是多态的。 Component 没有任何 virtual 方法,因此不是多态的。除非我误解了dynamic_cast&lt;&gt;,否则我认为该解决方案不会奏效。

标签: c++ templates boost unity3d


【解决方案1】:

现在已经回答了 - 请参阅最后一条评论:

@Mutmansky,我不知道在 C++ 中实现的模板化函数需要在头文件中,以及模板化函数的定义。在我这样做之后,按照 Scott Langham 的建议,编译器错误消失了。如果您想查看该文件的源代码,我很乐意在此处发布/发送消息给您。告诉我!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多