2015-04-05 89 views
0

我正在嘗試使用一個自定義的頭文件集來使用通用列表並使用運算符< <使其能夠打印到一個ostream對象中 有幾個錯誤我無法解決。運算符<<在C++中使用自定義數據結構

我想使用通用的節點類來製作一個通用的List類。應使用操作員< <打印通用列表。但是,我收到了很多錯誤。你的類

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

class List; 

template<class T> 
class Node 
{ 
    friend class List<Node>; 
    private: 
    T data_; 
    Node *next_; 

    public: 
    Node(T data); 
    T get_data(); 
}; 

template<typename T> 
Node<T>::Node(T data) 
{ 
    data_ = data; 
    next_ = 0; 
} 

template<typename T> 
T Node<T>::get_data() 
{ 
    return data_; 
} 

template<typename T> 
class Node; 

template<typename T> 
class List 
{ 
    template<typename T> 
    friend ostream& operator<<(ostream& o , const List<T> head); 

    private: 
    Node<T> *start_; 
    bool is_empty(); 

    public: 
    List(); 
    ~List(); 
    void insert(T data); 
    void remove(); 
}; 

template<typename T> 
bool List<T>::is_empty() 
{ 
    if(start_ == 0) 
     return true;   
    return false; 
} 

template<typename T> 
List<T>::List() 
{ 
    start_ = 0; 
} 

template<typename T> 
List<T>::~List() 
{ 
    if(!is_empty()) 
    { 
     Node<T> *current = start_; 
     Node<T> *temp; 
     while(current != 0) 
     { 
      temp = current; 
      current = current->next_; 
      delete temp; 
     } 
    } 
} 

template<typename T> 
void List<T>::insert(T data) 
{ 
    if(is_empty()) 
    { 
     Node<T> *temp = new Node<T>(data); 
     start_ = temp; 
    } 
    else 
    { 
     Node<T> *temp = start_; 
     while(temp->next_ != 0) 
     { 
      temp = temp->next_; 
     } 
     temp->next_ = new Node<T>(data); 
    } 
} 

template<typename T> 
void List<T>::remove() 
{ 
    if(start_->next_ == 0) 
    { 
     Node<T> *temp = start_->next_; 
     start_->next_ = 0; 
     delete temp; 
    } 
    else if(!is_empty()) 
    { 
     Node<T> *stay = start_; 
     Node<T> *remove = stay->next_; 
     while(remove->next_ != 0) 
     { 
      stay = remove; 
      remove = remove->next_; 
     } 
     stay->next_ = 0; 
     delete remove; 
    } 
} 


// Experimental Stuff out here 
template<typename T> 
ostream& operator<<(ostream& o , const List<T> *head) 
{ 
    Node<T> *temp = head->start_; 
    if(!is_empty<T>()) 
    { 
     while(temp->next_ != 0) 
     { 
      o << temp.get_data() << "\t"; 
      o << "\n"; 
      temp = temp->next_; 
     } 
    } 
    return o; 
} 
// End of Experimental Stuff 
+1

你得到的錯誤是什麼?你可能會讀這個:http://stackoverflow.com/questions/4421706/operator-overloading – 2015-04-05 10:00:19

+0

temp.get_data()這應該是temp-> get_data(),因爲temp是一個指針 – nikaltipar 2015-04-05 10:01:04

+0

有沒有編譯器錯誤運算符在這裏重載。 – 2015-04-05 10:17:06

回答

2

假設客戶實例化這樣的:

List<int> my_list; 

您需要定義您的operator <<超載這樣的:

template <typename T> 
std::ostream& operator << (std::ostream& os, const List<T>& list) 
{ 
    // I'm gonna assume you have C++11 
    auto node = list.start_; 
    while (node != nullptr) 
    { 
     os << '\t' << node->get_data() << '\n'; 
     node = node->next_; 
    } 
    return os; 
} 

此外,也有錯誤的負載你關於模板的代碼,所以請先修復它們。