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;
}
En effet, c'était simple. Je ne savais pas que les classes doivent avoir une déclaration avant aussi. –