所有派生类的显式实例化

Pro*_*mer 0 c++ templates instantiation

我有一Component节课:

class Component 
{

}
Run Code Online (Sandbox Code Playgroud)

然后是一个Collider继承自它的类:

class Collider :public Component
{

}
Run Code Online (Sandbox Code Playgroud)

并且SphereCollider继承自Collider:

class SphereCollider :public Collider
{

}
Run Code Online (Sandbox Code Playgroud)

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

GameObject.h标题:

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

    //Get functionality
    template <typename T>
    T& GetComponent();
}
Run Code Online (Sandbox Code Playgroud)

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>();
Run Code Online (Sandbox Code Playgroud)

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

GameObject gameObject;
SphereCollider sCollider1 = gameObject.AddComponent<SphereCollider>();
SphereCollider sCollider2 = gameObject.GetComponent<SphereCollider>();
Component sCollider3 = gameObject.GetComponent<Component>();
Run Code Online (Sandbox Code Playgroud)

问题:

我需要将其用作库并隐藏源文件.由于我为GameObject.cpp源中的ComponentSphereCollider类添加了显式实例化,因此只能编译.

例如,

Collider sCollider = gameObject.GetComponent<InnoEngine::Collider>();
Run Code Online (Sandbox Code Playgroud)

除非我还添加:

template Collider &GameObject::GetComponent<Collider>();
template Collider &GameObject::AddComponent<Collider>();
Run Code Online (Sandbox Code Playgroud)

GameObject.cpp源代码中.

因为使用GetComponentAddComponent函数的所有内容都继承自Component类,是否有一种方法可以自动为从Component类继承的每个类进行显式实例化?

我试过了template Component &GameObject::GetComponent<Component>(); ,template Component &GameObject::AddComponent<Component>();但是没有用,只给了我"未解决的外部符号"错误.

我目前唯一的选择是将所有模板函数放在头文件中,但这将为两者GetComponentAddComponent模板函数公开一个重要的代码.

Dmi*_*don 5

不,这是不可能的.

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

2)Component如果你没有添加相应的include,那么派生自的某些类在GameObject.cpp中是不可访问的.因此,在一般情况下,编译器甚至理论上无法获取所有继承者的列表,因为此信息仅在链接时可用.