2016-12-13 118 views
1

在C++上,我試圖創建一個鏈接列表來追加整個類。 不過,我總是得到同樣的錯誤:錯誤:「對運算符<<(std :: ostream&,Dogs const&)的未定義引用」

Undefined reference to operator<<std::ostream&, Dogs const&) 

我有3檔,2頭和1 CPP。

這是頭什麼樣子:

LinkedList.h:

// A class template for holding a linked list. 
#ifndef LINKEDLIST_H 
#define LINKEDLIST_H 
#include <iostream>  // For cout and NULL 
using namespace std; 

template <class T> 
class LinkedList 
{ 
private: 
    // Declare a structure for the list 
    struct ListNode 
    { 
     T value;    // The value in this node 
     struct ListNode *next; // To point to the next node 
    }; 

    ListNode *head; // List head pointer 

public: 
    // Constructor 
    LinkedList() 
     { head = NULL; } 

    // Destructor 
    ~LinkedList() {}; 

    // Linked list operations 
    void appendNode(T); 
    void displayList() const; 
}; 


//************************************************** 
// appendNode appends a node containing the value * 
// pased into newValue, to the end of the list. * 
//************************************************** 

template <class T> 
void LinkedList<T>::appendNode(T newValue) 
{ 
    ListNode *newNode; // To point to a new node 
    ListNode *nodePtr; // To move through the list 

    // Allocate a new node and store newValue there. 
    newNode = new ListNode; 
    newNode->value = newValue; 
    newNode->next = NULL; 

    // If there are no nodes in the list 
    // make newNode the first node. 
    if (!head) 
     head = newNode; 
    else // Otherwise, insert newNode at end. 
    { 
     // Initialize nodePtr to head of list. 
     nodePtr = head; 

     // Find the last node in the list. 
     while (nodePtr->next) 
     nodePtr = nodePtr->next; 

     // Insert newNode as the last node. 
     nodePtr->next = newNode; 
    } 
} 

//************************************************** 
// displayList shows the value      * 
// stored in each node of the linked list   * 
// pointed to by head.        * 
//************************************************** 

template <class T> 
void LinkedList<T>::displayList() const 
{ 
    ListNode *nodePtr; // To move through the list 

    // Position nodePtr at the head of the list. 
    nodePtr = head; 

    // While nodePtr points to a node, traverse 
    // the list. 
    while (nodePtr) 
    { 
     // Display the value in this node. 
     cout << nodePtr->value << endl; 

     // Move to the next node. 
     nodePtr = nodePtr->next; 
    } 
} 
#endif 

Dogs.h:

#ifndef Dogs_H 
#define Dogs_H 
#include <string> 
#include <iostream> 
using namespace std; 

class Dogs; 
template <class T> 

ostream& operator << (ostream&, const Dogs&); 
istream& operator >> (istream&, Dogs&); 

class Dogs 
{ 
private: 
    string dgName; 
    string dgBreed; 
    string dgColour; 
    string dgDad; 
    string dgMom; 


public: 
    Dogs(string name ="", string breed ="", string colour ="", string dad ="", string mom ="") 
    { 
     dgName = name; 
     dgBreed = breed; 
     dgColour = colour; 
     dgDad = dad; 
     dgMom = mom; 
    } 

    friend ostream& operator << (ostream&, const Dogs&); 
    friend istream& operator >> (istream&, Dogs&); 


}; 

#endif 

我真的很感激,如果你能點我出了我的問題在哪裏。 預先感謝您。

+0

您的標題說'ostream&operator <<(sstream&,const Dog&)'存在,但是您沒有顯示任何定義該運算符的代碼。你爲什麼認爲它存在? –

+0

據我所知,我沒有定義一個操作符。我仍然對運營商有一個模糊的認識。你能給我發一個關於運營商的鏈接嗎?這將不勝感激。非常感謝你。 – Imad

+0

運算符只是一個函數的時髦名稱。編寫一個將'Dog'對象插入'std :: ostream'類型的對象的函數。 –

回答

0

與模板規範

template <class T> 
^^^^^^^^^^^^^^^^^^ 
ostream& operator << (ostream&, const Dogs&); 

刪除線,不要忘記定義操作。

+0

感謝您的快速回復。但是,您能否更精確地定義運營商?謝謝! – Imad

+0

@Imad標題中只有操作員的聲明。你必須定義它,你需要編寫代碼這個操作符將如何輸出類Dog的對象。 –

+0

我試圖在** Dogs.h **中定義一個運算符,但是它仍然顯示相同的錯誤。這裏是我寫的'狗操作符+(const狗&a)狗狗; \t \t dog.dgName = this-> dgName + a。dgName; \t \t dog.dgBreed = this-> dgBreed + a.dgBreed; \t \t dog.dgColour = this-> dgColour + a.dgColour; \t \t dog.dgDad = this-> dgDad + a.dgDad; \t \t dog.dgMom = this-> dgMom + a.dgMom; \t \t歸還狗; \t}' – Imad

相關問題