Search code examples
c++coutostream

What does "Invalid operands to binary expression (ostream and void)" mean, and how can it be fixed?


I'm encountering an error that says:

Invalid operands to binary expression ('ostream' (aka 'basic_ostream') and 'void')

I understand there are some questions related to this error posted on StackOverflow but I need some help and explanations regarding this specific context on what this error means.

In the main() function, I create a student object called s1. The error happens in main() where I'm trying to get the results of his GPA using a method of the Student class called getResults(double gpa).

#include <iostream>

using namespace std;

class Human{
    protected: string name;
    protected: int age;
    
public: Human(){
        name = "Unknown";
        age = 5;
    }
    
public:
    Human(string name, int age){
    this->name = name;
    this->age = age;
}
    
    string getName(){
        return name;
    }
    
    int getAge(){
        return age;
    }
    
    void setName(string name){
        this->name = name;
    }
    
    void setAge(int age){
        this->age = age;
    }        
};

class Student: public Human{
    protected: string school;
    protected: double gpa;
    
public:
    Student(string name, int age, string school, double gpa) : Human(name, age){
        this->school = school;
        this->gpa = gpa;
    }
    
    double getGPA(){
        return gpa;
    }
    
    string getSchool(){
        return school;
    }
    
    void setGPA(double gpa){
        this->gpa = gpa;
    }
    
    void setSchool(string school){
        this->school = school;
    }
    
    void getResult(double gpa){
        if (gpa < 3.0) {
            cout << "You did well!";
        } else {
            cout << "Try harder next time";
        }
    }
    
};

int main() {
    Student s1 ("John", 23, 'm', "University of Chicago", 3.4);
    double s1GPA = s1.getGPA();
    cout << s1.getResult(s1GPA) << endl;
    return 0;
}

Solution

  • Currently, your getResults function has a void return type, which means it doesn't actually return anything. Because of this, do not try to cout the result of this function in your main.

    Consider the following edit:

    // Your result is printed within this function
    s1.getResult(s1GPA);
    
    // Print a new line if you wish
    cout << endl;
    

    Also, since your getResults doesn't really get anything, I'd suggest changing the name to something like printResults.

    Note

    Notice how in your getResult it doesn't return anything because it's a void. In this function, you're just outputting text to the console with cout:

    // Notice that this function doesn't actually return anything
    void getResult(double gpa){
        if (gpa < 3.0) {
            // Output this message to console
            cout << "You did well!";
        } else {
            // Output this message to console
            cout << "Try harder next time";
        }
    }
    

    When you have the statement in your main, it's trying to cout nothing because getResult is a void:

    cout << s1.getResult(s1GPA) << endl;
    //      ^^^^^^^^^^^^^^^^^^^
    //      This doesn't return anything for cout to output.
    

    That is why you only need to call getResult instead of trying to cout it.