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.
Есть ли способ получить это для правильной связи?
Общим способом организации кода шаблона является размещение объявления класса в 'foo.h' как обычно, а реализация, например, 'foo.hxx' (суффикс варьируется между проектами). Прямо внизу 'foo.h' - но все еще внутри защитного блока include - реализация затем включается с помощью директивы' #include "foo.hxx" '. –
@ gareth.stockwell Так распространено, что я его никогда не видел. Какие преимущества это дает вам? – 2010-02-19 10:46:02
@Neil Butterworth: Идея состоит в том, чтобы отделить реализацию от интерфейса. Попытайтесь скрыть детали реализации от пользователя. – Andy