2013-09-22 2 views
0

Я пишу обобщенный список для моего класса структур данных, и я думаю, что у меня проблема с пользовательскими шаблонами. У меня есть этот кодОшибка в общем классе узлов класса

ListNode.h

#ifndef LISTNODE_H 
#define LISTNODE_H 

#include <iostream> 
using std::ostream; 

template <class Datatype> 
class ListNode 
{ 
public: 
    ListNode(Datatype data); 
    ListNode<Datatype>* next() const; 
    void next(ListNode* next); 
    ListNode<Datatype>* previous() const; 
    void previous(ListNode* previous); 
    Datatype data() const; 
    void data(Datatype data); 
    void write(ostream& out) const; 

private: 
    ListNode<Datatype>* m_next; 
    ListNode<Datatype>* m_previous; 
    Datatype m_data; 
}; 

template <class Datatype> 
ostream& operator << (ostream& out, const ListNode<Datatype>& node); 

#endif /* LISTNODE_H */ 

ListNode.cpp

#include <iostream> 
using std::ostream; 

#include "include/List/ListNode.h" 

template <class Datatype> 
ListNode<Datatype>::ListNode(Datatype data) 
{ 
    m_data = data; 
    m_previous = 0; 
    m_next = 0; 
} 

template <class Datatype> 
ListNode<Datatype>* ListNode<Datatype>::next() const 
{ 
    return m_next; 
} 

template <class Datatype> 
void ListNode<Datatype>::next(ListNode<Datatype>* next) 
{ 
    m_next = next; 
} 

template <class Datatype> 
ListNode<Datatype>* ListNode<Datatype>::previous() const 
{ 
    return m_previous; 
} 

template <class Datatype> 
void ListNode<Datatype>::previous(ListNode<Datatype>* previous) 
{ 
    m_previous = previous; 
} 

template <class Datatype> 
Datatype ListNode<Datatype>::data() const 
{ 
    return m_data; 
} 

template <class Datatype> 
void ListNode<Datatype>::data(Datatype data) 
{ 
    m_data = data; 
} 

template <class Datatype> 
void ListNode<Datatype>::write(ostream& out) const 
{ 
    out << m_data; 
} 

template <class Datatype> 
ostream& operator << (ostream& out, const ListNode<Datatype>& node) 
{ 
    node.write(out); 
    return out; 
} 

main.cpp

#include <iostream> 
using std::cout; 
using std::endl; 

#include "include/List/ListNode.h" 

int main(int argc, char** argv) 
{ 
    ListNode<int> node(10); 

    cout << node; 

    return 0; 
} 

Так что, когда я пытаюсь скомпилировать, что я получаю:

main.cpp: 9: undefined refe Renče в `ListNode :: ListNode (INT) '

main.cpp:. 9 :(текст + 0x21): Вынос усекается: R_X86_64_PC32 против неопределенного символа` ListNode :: ListNode (INT)'

Я был бы признателен, если бы кто-нибудь мог сказать мне, что я делаю неправильно

ответ

0

Это очень просто, вы должны поместить код шаблона в файлы заголовков, иначе вы получите ошибки ссылок. Код шаблона является особенным. Компилятор должен знать определение (а не только объявление) любого шаблона в той точке, в которой он используется. Таким образом, весь код шаблона должен идти в заголовочных файлах.

Для получения более подробной информации см. here.

Удалить ListNode.cpp и поместить все его код в ListNode.h

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