调用模板ctor时未解析的外部符号

时间:2012-02-20 18:25:33

标签: c++ templates linker-errors

在创建模板类的实例时,我无法理解为什么我得到一个未解析的外部符号。

导致链接器错误的行是以下对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个未解析的外部

有人可以发现我的疏忽吗?

1 个答案:

答案 0 :(得分:1)

Vbo构造函数定义在哪里?我猜它是在.cpp或.cc文件而不是头文件。模板函数定义需要在标题中(或者您可以使用更多奇特的功能,如显式模板实例化)。这是因为模板函数在使用时仅被理解为实际代码,我假设您的使用与您的定义不在同一个翻译单元中。