2010-02-19 7 views
1

Headerшаблона класса не будет строить должным образом

class linkNode { 
    public: 
     linkNode(void *p) { 
      before = 0; 
      after = 0; 
      me = p; 
     } 

     linkNode *before; 
     void *me; 
     linkNode *after; 
    }; 

    template <class T> 
    class list 
    { 
    public: 
     list(void) { first = last = NULL; size = 0; } 
     ~list(void) { while(first) deleteNode(first); }  
    private: 
     void deleteNode(linkNode *l); 

     linkNode *first, *last; 
     unsigned int size; 
    }; 

.CPP

template <class T> 
inline void list<T>::deleteNode(linkNode *l) { 
    if(c->before) 
     if(c->after) { 
      c->before->after = c->after; 
      c->after->before = c->before; 
     } else 
      c->before->after = last = NULL; 
    else 
     if(c->after) 
      c->after = first = NULL; 
    delete c; size--; 
} 

У меня есть этот набор, чтобы построить как .lib и строит отлично. Когда я пытаюсь ePhys::list<int> myList; Я получаю ошибку компоновщика, говоря, что она не может найти ePhys::list<int>::deleteNode(class ePhys::linkNode *). Это не проблема с настройкой с использованием библиотеки, я протестировал ее с другими фиктивными классами.

Я использую бета-версию MSVC 2010.

Есть ли способ получить это для правильной связи?

ответ

4

C++ не поддерживает отдельную компиляцию шаблонов - вам нужно поместить весь свой шаблон в заголовочный файл (ы).

+0

Общим способом организации кода шаблона является размещение объявления класса в 'foo.h' как обычно, а реализация, например, 'foo.hxx' (суффикс варьируется между проектами). Прямо внизу 'foo.h' - но все еще внутри защитного блока include - реализация затем включается с помощью директивы' #include "foo.hxx" '. –

+0

@ gareth.stockwell Так распространено, что я его никогда не видел. Какие преимущества это дает вам? – 2010-02-19 10:46:02

+0

@Neil Butterworth: Идея состоит в том, чтобы отделить реализацию от интерфейса. Попытайтесь скрыть детали реализации от пользователя. – Andy