Неразрешенный внешний символ при вызове шаблона ctor - PullRequest
0 голосов
/ 20 февраля 2012

Мне трудно понять, почему я получаю неразрешенный внешний символ при создании экземпляра класса шаблона.

Строка, которая вызывает ошибку компоновщика, является вызовом 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> Actor.obj: ошибка LNK2019: неразрешенный внешний символ "public: __thiscall Vbo :: Vbo (int, класс CustomVertex * *, int, unsigned long *)" (?? 0? $ Vbo @ VCustomVertex @@@ @ QAE @ HPAPAVCustomVertex @@ HPAK @ Z) ссылка на функцию "private: bool __thiscall Actor :: InitializeGeometry (class IGeometry &)" (? InitializeGeometry @ Actor @@ AAE_NAAVIGeometry @@@ Z) 1> C: \ cuprofen \ Debug \ Cuprofen.exe: фатальная ошибка LNK1120: 1 неразрешенный внешний код

Может кто-то заметить мою оплошность?

1 Ответ

1 голос
/ 20 февраля 2012

Где определен конструктор Vbo? Я предполагаю, что это в файле .cpp или .cc, а не в заголовочном файле. Определения функций шаблона должны быть в заголовке (или вы можете использовать более экзотические функции, такие как явная реализация шаблона). Это потому, что функция шаблона понимается как фактический код только тогда, когда она используется, и я предполагаю, что вы используете ее не в той же единице перевода, что и ваше определение.

...