2015-01-28 3 views
-4
#include <iostream> 
using namespace std; 

template <typename E> 
class SNode{ 
    E elem; 
    SNode<E>* next; 
    friend class SLINKEDList <E>; 
}; 

template <typename E> 
class SLinkedList { // a singly linked list 
public: 
    SLinkedList(); // empty list constructor 
    ~SLinkedList(); // destructor 
    bool empty() const; // is list empty? 
    const E& front() const; // return front element 
    void addFront(const E& e); // add to front of list 
    void removeFront(); // remove front item list 
private: 
    SNode<E>* head; // head of the list 
}; 
template <typename E> 
SLinkedList<E>::SLinkedList() // constructor 
    : head(NULL) { } 
template <typename E> 
bool SLinkedList<E>::empty() const // is list empty? 
{ 
    return head == NULL; 
} 
template <typename E> 
const E& SLinkedList<E>::front() const // return front element 
{ 
    return head−>elem; 
} 
template <typename E> 
SLinkedList<E>::~SLinkedList() // destructor 
{ 
    while (!empty()) removeFront(); 
} 
template <typename E> 
void SLinkedList<E>::addFront(const E& e) { // add to front of list 
    SNode<E>* v = new SNode<E>; // create new node 
    v−>elem = e; // store data 
    v−>next = head; // head now follows v 
    head = v; // v is now the head 
} 
template <typename E> 
void SLinkedList<E>::removeFront() { // remove front item 
    SNode<E>* old = head; // save current head 
    head = old−>next; // skip over old head 
    delete old; // delete the old head 
} 
int main(){ 

    return 0; 
} 

Я скопировал этот код узла из моей книги структур данных (Goodman), и у него есть ошибки, но я не уверен, почему. Я попытался вручную напечатать его, чтобы узнать, не является ли это проблемой кодировки символов, но, похоже, это не так. Я также попытался определить SLinkedLists, но это не изменило результаты. Ошибки:Как <синтаксическая ошибка?

Ошибка 1 ошибка C2059: ошибка синтаксиса: '<'

Ошибка 2 Ошибка C2238: непредвиденный лексем (ы), предшествующий ';'

+1

'SLINKEDList' не был определен как класс шаблона в этом файле. Я предполагаю, что это то, что «SLINKEDList» есть, но компилятор не может предположить. –

+0

Определение и перекомпиляция SLinkedList не помогает. – NickG

+0

Когда компилятор достигает строки с вашей ошибкой, 'SLINKEDList' не был определен как класс шаблона. Вы должны определить его ** перед ** вы его используете. –

ответ

2

В вашем оригинального кода, нет SLINKEDList определен где-нибудь в этом файл, это не должно быть в единственном включаемом файле, iostream.

На самом деле g++ также жалуется, но с другой ошибкой:

qq.cpp:8:15: error: ‘SLINKEDList’ is not a class template 
    friend class SLINKEDList <E>; 
       ^

Мой совет будет включать любые файлы заголовков или кода требуется, чтобы определить SLINKEDList, которые должны исправить вашу непосредственную проблему.

В вашем обновленный код, вы определяете его, но после того, как вы используете его, так что вы все еще есть та же самая проблема - это не определено, где она должна быть. В любом случае SLINKEDList - это не так же, как SLinkedList, поэтому вам также нужно исправить это.

Вы можете сделать это chaanging:

template <typename E> 
class SNode{ 
    E elem; 
    SNode<E>* next; 
    friend class SLINKEDList <E>; 
}; 

в:

template <typename E> class SLinkedList; 
template <typename E> class SNode{ 
    E elem; 
    SNode<E>* next; 
    friend class SLinkedList <E>; 
}; 
+0

Определение и перекомпиляция SLinkedList не помогает. – NickG

1

Вам просто нужно удалить <E> от Вашего друга декларации.

friend class SLINKEDList; 

Если вы задаетесь вопросом, почему стоит считать this.

1

У данного кода возникает ряд проблем.

По крайней мере, на мой взгляд, SNode действительно должен быть вложенным классом внутри SLinkedList (так как помимо всего прочего ничто вне класса связанного списка не имеет бизнеса, зная, что оно даже существует). Во-вторых, он пытается объявить класс с именем SLINKDEDList в качестве друга, но такой код не существует в коде - он должен быть SLinkedList (C++ чувствителен к регистру). В-третьих, декларация друга должна быть только SLinkedList, а не SlinkedList<E>.

Если гнездо классу узла внутри связанного класса списка, однако, вам не нужен друг декларация на всех, так что получается нечто вроде этого:

template <typename E> 
class SLinkedList { // a singly linked list 
    struct SNode{ 
     E elem; 
     SNode *next; 
    }; 
public: 
    SLinkedList(); // empty list constructor 
    ~SLinkedList(); // destructor 
    bool empty() const; // is list empty? 
    const E& front() const; // return front element 
    void addFront(const E& e); // add to front of list 
    void removeFront(); // remove front item list 
private: 
    SNode *head; // head of the list 
}; 

У вас также есть несколько мест, где у вас есть что-то вроде v− > elem. Для этого необходимо заменить на v->elem.Хотя вы можете добавить больше пробелов до - или после >, у вас должно не иметь пробела между - и >. Его следует набирать как ->, а не - >, чтобы быть признанным оператором «указатель на».

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