如何指定C++类的特定方法使用模板

How does one specify that a specific method of a C++ class uses templates?

本文关键字:方法 何指定 C++      更新时间:2023-10-16

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

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

我正在尝试通过 boost::anyboost::any_cast s 存储具体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。 我正在尝试向GameObject添加两个Component,然后我正在尝试访问添加的两个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>();
    }

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

  1. ...undefined reference to `bool BalaurEngine::Composites::ComponentComposite::addComponent<BalaurEngine::Components::AudioComponent>(BalaurEngine::Components::AudioComponent*)'
  2. ...undefined reference to `bool BalaurEngine::Composites::ComponentComposite::addComponent<BalaurEngine::Components::TransformComponent>(BalaurEngine::Components::TransformComponent*)'
  3. ...undefined reference to `BalaurEngine::Components::TransformComponent* BalaurEngine::Composites::ComponentComposite::getComponent<BalaurEngine::Components::TransformComponent>()'
  4. ...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++ 中实现的模板化函数需要与模板化函数的定义一起在标题中。在我这样做之后,按照Scott Langham的建议,编译器错误消失了。如果您想查看该文件的源代码,我很乐意将其发布在这里/发送给您。让我知道!