I am trying to create a LinkedList
that takes user information and stores it into its nodes. After which it will display the user information. I have already worked trough this and this is what I have:
#include <iostream>
using namespace std;
template <typename T>
class Node
{
T data;
Node* next;
};
template <typename T>
class LinkedList
{
public:
//Default constructor
LinkedList(){
head = NULL;
tail = NULL;
}
void addData(T val){
Node* newNode = new Node;
newNode->data = val;
newNode->next = NULL; // we add newNode at end of linked list
if( head == NULL){
head = newNode;
tail = newNode;
}
else{
tail ->next = newNode;
tail = newNode;
}
}
void printData() {
for(Node* i = head; i!=NULL; i = i -> next){
cout << i->data << " " ;
}
}
private:
//Declare the head and tail of the LinkedList
Node* head;
Node* tail;
};
int main(){
LinkedList<string> usrInput;
cout << "Enter a number or word : ";
string input ;
cin >> input;
usrInput.addData(input);
usrInput.printData();
LinkedList<int> numbers;
while (true)
{
cout<< "Enter a number (-1 to stop): ";
int num;
cin >> num;
if (num == -1)
break;
numbers.addData(num);
}
numbers.printData();
}
The problem is that when I compile my program, I get a bunch of errors referring to out of scope member variables. Are the member variables not suppose to be private?
This is what I have for the debugger:
46:9: error: invalid use of template-name 'Node' without an argument list
47:9: error: invalid use of template-name 'Node' without an argument list
In constructor 'LinkedList<T>::LinkedList()':
18:9: error: 'head' was not declared in this scope
19:9: error: 'tail' was not declared in this scope
In member function 'void LinkedList<T>::addData(T)':
23:13: error: missing template arguments before '*' token
23:15: error: 'newNode' was not declared in this scope
23:29: error: invalid use of template-name 'Node' without an argument list
26:13: error: 'head' was not declared in this scope
28:13: error: 'tail' was not declared in this scope
32:13: error: 'tail' was not declared in this scope
In member function 'void LinkedList<T>::printData()':
38:17: error: missing template arguments before '*' token
38:19: error: 'i' was not declared in this scope
38:23: error: 'head' was not declared in this scope
The data members of a class are private by default. They are public by default on structs. That is, in:
class Node
{
T data;
Node* next;
};
The LinkedList class has no visibility into the Node's members. Try either using:
struct Node {
T data;
Node* next;
};
or
class Node {
public:
T data;
Node* next;
};
Stylistically, most real implementations nest the Node as a private member struct inside the LinkedList class.
Node
alone does not refer to a valid type in your code. You need to use Node<T>
.
When the compiler encounters Node
it flags it as an illegal use and discards the variable or member being defined with that type, causing additional errors later in the compile when you use the variable or member.
Once you switch to use a complete type with Node<T>
you will then run into the issue mentioned in the other answer with private membership of the members of the Node<T>
class.
i hope my answer will be helpull for other people too, even if i'm late haha :) :
#include <iostream>
using namespace std;
template <typename Type>
class Node
{
template<typename T> friend class LinkedList;/* you need to make your linkedList
class a friend variable to be able to,acces the private members directly from the objects inside the class Linkedlist.
other option its to make them public, but it is not recomended and other option si to make functions to acces de data, but this will be very messy, just make your linkedlist class friend*/
Type data;
Node<Type>* next; // you need to specify which data type the node will be
};
template <typename T>
class LinkedList
{
public:
//Default constructor
LinkedList(){
head = NULL;
tail = NULL;
}
void addData(T val){
// you can't forget to specify the data type since it is a template!!
Node<T>* newNode = new Node<T>();
newNode->data = val;
newNode->next = NULL; // we add newNode at end of linked list
if( head == NULL){
head = newNode;
tail = newNode;
}
else{
tail ->next = newNode;
tail = newNode;
}
}
void printData() {
// again specify the data type of the template
for(Node<T>* i = head; i !=NULL; i = i -> next){
cout << i->data << "\n" ;
}
}
private:
//Declare the head and tail of the LinkedList
Node<T>* head;// Again specify the data type of the template
Node<T>* tail;// here the same thing
};
int main(){
LinkedList<string> usrInput;
cout << "Enter a number or word : ";
string input ;
getline(cin,input);// use the get line function to get strings from standar input
usrInput.addData(input);
usrInput.printData();
// Declare the num variable otuside and initialize it, you should always initialize the variables
int num(0);
LinkedList<int> numbers;
while (true)
{
cout<< "Enter a number (-1 to stop): ";
// you need to validate the input if you don't want to run an infinite loop
if(!(cin >> num)){
cin.clear();
cin.ignore(100,'\n');
}
else {
// if we succes with the imput you can add the data to the linked list :)
if (num == -1){break;}
numbers.addData(num);
}
}
numbers.printData();
}
The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.