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源中的Component和SphereCollider类添加了显式实例化,因此只能编译.
例如,
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源代码中.
因为使用GetComponent和AddComponent函数的所有内容都继承自Component类,是否有一种方法可以自动为从Component类继承的每个类进行显式实例化?
我试过了template Component &GameObject::GetComponent<Component>();
,template Component &GameObject::AddComponent<Component>();但是没有用,只给了我"未解决的外部符号"错误.
我目前唯一的选择是将所有模板函数放在头文件中,但这将为两者GetComponent和AddComponent模板函数公开一个重要的代码.
不,这是不可能的.
1)template Component &GameObject::GetComponent<Component>()是仅针对具体Component类的显式实例化.编译器找不到纯虚方法的定义,因此会出现链接器错误.
2)Component如果你没有添加相应的include,那么派生自的某些类在GameObject.cpp中是不可访问的.因此,在一般情况下,编译器甚至理论上无法获取所有继承者的列表,因为此信息仅在链接时可用.