2017-01-24 1 views
1

J'ai écrit un petit code pour pratiquer les structures de données et le beau C++.Erreurs avec la fonction d'ami dans Clion C++

Le code ci-dessous fonctionne très bien si les variables SNode sont publiques et que la ligne friend class ... est supprimée. Cependant, d'après le manuel que je suis en train de lire, cela devrait fonctionner correctement.

Les erreurs que je reçois sont les suivantes:

  • line 11: error: ‘SLinkedList’ is not a class template
  • Dans instanciation de 'classe Nœud-S': line 10: error: template argument required for ‘class SLinkedList’
  • En instanciation du « vide SLinkedList :: addFront (const E &) [avec E = int] ': line 9: error: ‘int SNode<int>::elem’ is private

Ci-dessous le code écrit en 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; 
} 

Répondre

1
friend class SLinkedList<E>; 

Ce modèle n'est pas encore déclaré. Votre code C++ est compilé de manière ordonnée, depuis le début de votre fichier source jusqu'à la fin. Jusqu'à ce que ce modèle soit déclaré plus tard dans ce fichier d'en-tête, le compilateur n'a aucune idée de ce que c'est.

La solution est très simple: ajouter une déclaration avant le début du fichier d'en-tête, parce que la déclaration de modèle SNode:

template <typename E> class SLinkedList; 

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

En effet, c'était simple. Je ne savais pas que les classes doivent avoir une déclaration avant aussi. –

1
friend class SLinkedList<E>; 

À ce stade SLinkedList est pas encore défini comme modèle, donc donnant l'erreur. Donner une déclaration à terme pour SLinkedList, tout ira bien que.

Ajouter ceci: -

template <typename E> 
class SLinkedList;