在创建模板类的实例时,我无法理解为什么我得到一个未解析的外部符号。
导致链接器错误的行是以下对new的调用:
Vbo<CustomVertex>* m_pVbo;
...
m_pVbo = new Vbo<CustomVertex> (
geometry.VertCount(),
geometry.Vertices(),
geometry.IndexCount(),
geometry.Indices()
);
// nb: geometry.Vertices return type is CustomVertex**
Vbo类的定义如下:
template <typename T>
class Vbo : public glex
{
public:
Vbo();
Vbo( int nNumVerts, T** ppVertices, int nNumIndices, DWORD* pIndices );
Vbo( const Vbo<T> & rhs ); // copy
Vbo<T> & operator=( const Vbo<T> & rhs ); // assignment
~Vbo();
...
}
Vbo构造函数的实现:
template <typename T>
Vbo<T>::Vbo( int nNumVerts, T** ppVertices, int nNumIndices, DWORD* pIndices ) :
m_bInitialized ( false ),
m_nVboId ( 0 ),
m_nVboIdIndex ( 0 ),
m_nNumVertices ( nNumVerts ),
m_nNumIndices ( nNumIndices ),
m_ppVertices ( ppVertices ),
m_pIndices ( pIndices )
{
glex::Load();
Initialize();
}
最后,来自链接器的抱怨:
1&gt; Actor.obj:错误LNK2019:未解析的外部符号“public:__thiscall Vbo :: Vbo(int,class CustomVertex * *,int,unsigned long *)”(?? 0?$ Vbo @ VCustomVertex @@@ @ QAE @ HPAPAVCustomVertex @@ HPAK @ Z)在函数“private:bool __thiscall Actor :: InitializeGeometry(class IGeometry&amp;)”中引用(?InitializeGeometry @ Actor @@ AAE_NAAVIGeometry @@@ Z) 1&gt; C:\ cuprofen \ Debug \ Cuprofen.exe:致命错误LNK1120:1个未解析的外部
有人可以发现我的疏忽吗?
答案 0 :(得分:1)
Vbo
构造函数定义在哪里?我猜它是在.cpp或.cc文件而不是头文件。模板函数定义需要在标题中(或者您可以使用更多奇特的功能,如显式模板实例化)。这是因为模板函数在使用时仅被理解为实际代码,我假设您的使用与您的定义不在同一个翻译单元中。