2012-02-20 3 views
0

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

Строка, которая вызывает ошибку компоновщика является вызов новым ниже:

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

Может ли кто-то определить мой надзор?

ответ

1

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

+0

Да, конструктор Vbo определен в файле .cpp. Я попробую переместить все в файл заголовка. –

+0

Спасибо, интересный ответ. Я переместил код Vbo в заголовок, и теперь моя ошибка компоновщика исчезла. Можете ли вы определить «единица перевода»? –

+1

@freefallr: Говоря свободно, это означает один исходный файл, плюс все, что включено в него. –

Смежные вопросы