Oct 17, 2016 at 10:40am UTC
Confused on why I'm getting an error when I try to store information into a node of type Student (they're different data types so I figured this would be best) and then use the class to store the information into a linked list node....
The error I'm getting is:
Error: Invalid operands to binary expression('basic_ostream<char>, std::__1char_traits<char> >' and "Student')
Why is this happening??
Here's the Student.h file
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
#ifndef STUDENT_H
#define STUDENT_H
using namespace std;
class Student
{
private :
int studentID;
string studentName,
studentAddress;
float studentGPA,
studentAverage;
public :
Student(int i = 0, string n = " " , string a = " " , float g = 0.0, float av = 0.0)
{
studentID = i;
studentName = n;
studentAddress = a;
studentGPA = g;
studentAverage = av;
}
void setStudentID(int i)
{
studentID = i;
}
void setStudentName(string n)
{
studentName = n;
}
void setStudentAddress(string a)
{
studentAddress = a;
}
void setStudentGPA(float g)
{
studentGPA = g;
}
void setStudentAverage(float av)
{
studentAverage = av;
}
int getStudentID() const
{
return studentID;
}
string getStudentName() const
{
return studentName;
}
string getStudentAddress() const
{
return studentAddress;
}
float getStudentGPA() const
{
return studentGPA;
}
float getStudentAverage() const
{
return studentAverage;
}
};
#endif
LinkedList.h file
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75
#ifndef LINKEDLIST_H
#define LINKEDLIST_H
#include <iostream>
using namespace std;
template <class T>
class LinkedList
{
private :
struct ListNode
{
T value;
struct ListNode *next;
};
ListNode *head;
public :
LinkedList()
{
head = nullptr ;
}
~LinkedList();
void appendNode(T);
void displayList();
};
template <class T>
void LinkedList<T>::appendNode(T newValue)
{
ListNode *newNode;
ListNode *nodePtr;
newNode = new ListNode;
newNode->value = newValue;
newNode->next = nullptr ;
if (!head)
{
head = newNode;
}
else
{
nodePtr = head;
while (nodePtr->next)
{
nodePtr = nodePtr->next;
}
nodePtr->next = newNode;
}
}
template <class T>
void LinkedList<T>::displayList()
{
ListNode *nodePtr;
nodePtr = head;
while (nodePtr)
{
cout << "Student Info: " << nodePtr->value << endl;
nodePtr = nodePtr->next;
cout << "\n" ;
}
}
#endif
and my cpp file
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
#include <iostream>
#include <string>
#include <list>
#include "LinkedList.h"
#include "Student.h"
using namespace std;
int main()
{
Student student1(23402394, "Student One" , "Address 1" , 2.45, 70);
Student student2(12312312, "Student Two" , "Address 2" , 3.78, 93);
LinkedList<Student> list;
list.appendNode(student1);
list.appendNode(student2);
cout << "-----------------------------------------" << endl;
list.displayList();
return 0;
}
Last edited on Oct 17, 2016 at 10:41am UTC
Oct 17, 2016 at 10:48am UTC
cout << "Student Info: " << nodePtr->value << endl;
Here, you are directing an object of type Student towards cout .
cout has no idea what to do with an object of type Student .
It knows how to deal with strings, and ints, and doubles, and chars, and various other kinds of object. It has no idea what to do with a Student.
Oct 17, 2016 at 10:52am UTC
But isn't Student an object of type class? So it should be able to access that type?
Oct 17, 2016 at 11:05am UTC
It knows how to access specific types of object, for which a << operator has been defined.
But it knows nothing about your Student type. How could it? How could it magically know how you want your class written out?
If you want to be able to stream your class like that, you need to write a << operator for it.
Oct 17, 2016 at 11:10am UTC
So it should be able to access that type?
And do what with it? What's it supposed to do with it? As Mikey says, is it meant to magically know how you want each internal value displayed? And in what order? And which ones to leave out?
Last edited on Oct 17, 2016 at 11:10am UTC
Oct 17, 2016 at 12:38pm UTC
Will it not run, or will it not compile?
Oct 17, 2016 at 2:55pm UTC
It doesn't give me any errors when it compiles but it doesn't execute the program.
Oct 17, 2016 at 3:04pm UTC
It shouldn't compile because on line 26 of LinkedList.h you promise to write a destructor, but you never do (or more accurately, it should compile but fail to link).
If your compiler/linker isn't telling you that, there's something wrong with your compiler/linker/combined-workflow or how you're using it.
Last edited on Oct 17, 2016 at 3:05pm UTC