2013-09-22 25 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倫斯到`ListNode :: ListNode(int)的 '

main.cpp中:9 :(文本+ 0×21):重定位截斷以適應:R_X86_64_PC32針對未定義的符號`ListNode :: ListNode(int)的'

如果有人能告訴我我做錯了什麼,我將不勝感激

回答

0

這很簡單,您必須將模板代碼放在頭文件中,否則會出現鏈接錯誤。模板代碼是特殊的。編譯器需要知道任何模板在使用時的定義(不僅僅是聲明)。所以所有的模板代碼都應該放在頭文件中。

有關更多詳細信息,請參見here

刪除ListNode.cpp並將其所有的代碼放在ListNode.h中