2017-01-24 7 views
1

Я написал небольшой код для обработки структур данных и красивого C++.Ошибки с функцией друга в Clion C++

Код ниже работает полностью нормально, если переменные в SNode публичные и удалить строку friend class .... Однако, основываясь на учебнике, который я читаю, это должно работать нормально.

Ошибки, которые я получаю, являются следующие:

  • line 11: error: ‘SLinkedList’ is not a class template
  • В конкретизации 'класса SNode': line 10: error: template argument required for ‘class SLinkedList’
  • В конкретизации Пустота SLinkedList :: addFront (Const E &) [с E = INT]: line 9: error: ‘int SNode<int>::elem’ is private

Ниже приведен код, написанный в Clion:

#include <iostream> 

using namespace std; 

template <typename E> 
class SNode { 
private: 
    E elem; //line 9 
    SNode<E> * next; // line 10 
    friend class SLinkedList<E>; //Provide SLinkedList access to these private variables (line 11) 
}; 



template <typename E> 
class SLinkedList { 
public: 
    SLinkedList(); 
    ~SLinkedList(); 
    bool empty() const; 
    const E& front() const; 
    void addFront(const E& e); 
    void removeFront(); 
    void printAll() const; 
private: 
    SNode<E> * head; 
}; 



template <typename E> 
SLinkedList<E>::SLinkedList():head(NULL){}; 

template <typename E> 
bool SLinkedList<E>::empty() const { 
    return (head==NULL); 
} 


template <typename E> 
void SLinkedList<E>::addFront(const E &e) { 
    SNode<E> * node = new SNode<E>; 
    node->elem=e; 
    node->next=head; 
    head=node; 
} 

template <typename E> 
void SLinkedList<E>::removeFront() { 
    SNode<E> * temp = head; 
    head = head->next; 
    delete temp; 
} 


template <typename E> 
const E& SLinkedList<E>::front() const { 
    return head->elem; 
} 

template <typename E> 
SLinkedList<E>::~SLinkedList() { 
    while (!empty()){ 
     removeFront(); 
    } 
} 

template <typename E> 
void SLinkedList<E>::printAll() const { 
    SNode<E> * itr =head; 
    while (itr != NULL){ 
     cout<<itr->elem<<" "; 
     itr = itr->next; 
    } 
} 




int main() { 
    cout << "Hello, World!" << endl; 
    SLinkedList<int> test ; 
    test.addFront(2); 
    test.addFront(3); 
    test.addFront(6); 
    test.addFront(8); 
    test.addFront(19); 
    test.printAll(); 



    return 0; 
} 

ответ

1
friend class SLinkedList<E>; 

Этот шаблон еще не объявлена. Ваш код на C++ компилируется упорядоченным образом, начиная с исходного файла и заканчивая концом. Пока этот шаблон не будет объявлен позже в этом заголовочном файле, компилятор не знает, что это такое.

Решение очень простое: добавить опережающее объявление в начало файла заголовка, так как декларации SNode шаблона:

template <typename E> class SLinkedList; 

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

Действительно это было просто. Не знал, что классы должны иметь и декларацию вперед. –

1
friend class SLinkedList<E>; 

На данный момент SLinkedList еще не определена в качестве шаблона, следовательно, давая ошибку. Дайте предварительную декларацию для SLinkedList, все будет хорошо, чем.

Добавить это: -

template <typename E> 
class SLinkedList;