c++ - 所有派生类的显式实例化

标签 c++ templates instantiation

我有一个 Component类:

class Component 
{

}

然后一个Collider从它继承的类:

class Collider :public Component
{

}

还有一个 SphereCollider继承自 Collider :

class SphereCollider :public Collider
{

}

最后,一个 GameObject您可以使用添加或删除组件的类。

GameObject.h header :

class GameObject
{
    //Add functionality
    template <class T>
    T& AddComponent();

    //Get functionality
    template <typename T>
    T& GetComponent();
}

GameObject.cpp 来源:

template <typename T>
T& GameObject::AddComponent(){}

template <typename T>
T& GameObject::GetComponent(){}

//Explicit instantiation 
template Component &GameObject::GetComponent<Component>();
template Component &GameObject::AddComponent<Component>();
template SphereCollider &GameObject::GetComponent<SphereCollider>();
template SphereCollider &GameObject::AddComponent<SphereCollider>();

一切正常。我可以在没有指针的情况下从 GameObject 添加或获取组件,如下所示:

GameObject gameObject;
SphereCollider sCollider1 = gameObject.AddComponent<SphereCollider>();
SphereCollider sCollider2 = gameObject.GetComponent<SphereCollider>();
Component sCollider3 = gameObject.GetComponent<Component>();

问题:

我需要将其用作库并隐藏源文件。因为我为 Component 添加了显式实例化和 SphereCollider GameObject.cpp 源中的类,只有那些可以编译。

例如,

Collider sCollider = gameObject.GetComponent<InnoEngine::Collider>();

将不会编译,除非我也添加:

template Collider &GameObject::GetComponent<Collider>();
template Collider &GameObject::AddComponent<Collider>();

GameObject.cpp 源中。

因为所有使用 GetComponent 的东西和 AddComponent函数继承自 Component类,有没有办法为每个继承自 Component 的类自动进行显式实例化?上课?

我试过了 template Component &GameObject::GetComponent<Component>();template Component &GameObject::AddComponent<Component>();但这没有用,只给了我“未解析的外部符号”错误。

目前我唯一的选择是将所有模板函数放在头文件中,但这会为 GetComponent 公开一个重要的代码。和 AddComponent模板函数。

最佳答案

不,这是不可能的。

1) template Component &GameObject::GetComponent<Component>()是仅针对具体 Component 的显式实例化类(class)。编译器找不到纯虚方法的定义,因此您会收到链接器错误。

2)一些派生自Component的类如果不添加相应的包含,在 GameObject.cpp 中可能无法访问。所以在一般情况下,编译器甚至在理论上也无法获得所有继承者的列表,因为此信息仅在链接时可用。

关于c++ - 所有派生类的显式实例化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44248644/

相关文章:

c++ - 推导元组的类型

swift - 在调用 super.init() 之前实例化调用自身的属性

java - 在泛型类中创建 Java 泛型类型的实例

java - org.hibernate.InstantiationException : No default constructor for entity: com. 域.AnomalieAck

c++ - Cxx-prettyprint(用于标准容器)在命名空间 std 内定义其输出操作符——这是否违反标准?

c++ - 从输入迭代器中获取最后一项

javascript - 从 Django 到 D3 图的 JSON 数据

非具体类型的 C++ 模板特化(另一个模板类!)

c++ - visual studio 中的标签标记

c++ - 我真的需要为 const 对象实现用户提供的构造函数吗?