如何指定C++类的特定方法使用模板
How does one specify that a specific method of a C++ class uses templates?
我在使用C++模板时遇到问题。 以下是我尝试做什么的解释,以便每个人都可以更好地了解我的问题。
我的框架有一个基类,Component
,我的框架的用户将派生Component
来创建具体的Components
,如TransformComponent
和AudioComponent
。ComponentComposite
存储给定用户创建的所有具体Component
的列表。
我正在尝试通过 boost::any
和 boost::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>();
}
这样做会引发四个错误(每个函数调用一个(:
-
...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++ 中实现的模板化函数需要与模板化函数的定义一起在标题中。在我这样做之后,按照Scott Langham的建议,编译器错误消失了。如果您想查看该文件的源代码,我很乐意将其发布在这里/发送给您。让我知道!
相关文章:
- 在 C++ 中将非指定类型作为参数传递的最佳方法?
- 调用从模板派生的类的静态方法,而不指定模板
- 在方法定义中显式指定命名空间
- C++中有没有一种方法可以通过指定列表中的每个成员变量来构造对象
- 在 C++17 之前指定 [[nodiscard]] 的方法
- 在派生类中调用基类方法,而无需指定基类名称
- 如何通过最快的方法删除指定的标签组件
- C - 是否有一种方法可以超载指定的初始化器
- 在不指定实例化的情况下调用类模板的静态方法的方法
- 有没有更快的方法来在 OpenGL 中指定立方体贴图纹理
- 使用多个库时,在 CMakeList 中配置target_link_libraries的正确方法是什么?获取无法指定链接
- 在 C 预处理器中指定一个文件夹/目录的正确方法是什么?
- 在C++中声明可见性/访问权限的方法有何不同
- 在文件中遇到指定单词后,是否有读取数据的方法
- 如何在不显式指定 OpenCV C++ 中 Mat 类型的情况下为不同的矩阵类型编写方法
- 为什么 GCC 在显式指定模板参数时会产生奇怪的错误并尝试调用错误的方法?
- 当 int 方法工作正常时,void 方法有何不同,或者为什么我不能调用 void 方法?
- 有没有一种方法可以在C++中指定指针指向始终有效的数据
- 是否有方法为模板参数指定所需的定义
- GCC是否有一种方法来指定是否在调用站点内联?