I have some code below that will take some names and ages and do some stuff with them. Eventually it will print them out. I need to change my print() function with a global operator<<. I saw on a different forum that <<operator takes two parameters, but when I try it I get a "too many parameters for << operation error. Is there something I am doing wrong? I am newer to C++ and I really do not get the point of operator overloading.
#include <iostream>; #include <string>; #include <vector>; #include <string.h>; #include <fstream>; #include <algorithm>; using namespace::std; class Name_Pairs{ vector<string> names; vector<double> ages; public: void read_Names(/*string file*/){ ifstream stream; string name; //Open new file stream.open("names.txt"); //Read file while(getline(stream, name)){ //Push names.push_back(name); } //Close stream.close(); } void read_Ages(){ double age; //Prompt user for each age for(int x = 0; x < names.size(); x++) { cout << "How old is " + names[x] + "? "; cin >> age; cout<<endl; //Push ages.push_back(age); } } bool sortNames(){ int size = names.size(); string tName; //Somethine went wrong if(size < 1) return false; //Temp vector<string> temp = names; vector<double> tempA = ages; //Sort Names sort(names.begin(), names.end()); //High on performance, but ok for small amounts of data for (int x = 0; x < size; x++){ tName = names[x]; for (int y = 0; y < size; y++){ //If the names are the same, then swap if (temp[y] == names[x]){ ages[x] = tempA[y]; } } } } void print(){ for(int x = 0; x < names.size(); x++){ cout << names[x] << " " << ages[x] << endl; } } ostream& operator<<(ostream& out, int x){ return out << names[x] << " " << ages[x] <<endl; } }; 2 Answers
You are overloading << operator as a member function, therefore, the first parameter is implicitly the calling object.
You should either overload it as friend function or as a free function. For example:
overloading as friend function.
friend ostream& operator<<(ostream& out, int x){ out << names[x] << " " << ages[x] <<endl; return out; } However, the canonical way is to overload it as free function. You can find very good information from this post: C++ operator overloading
declare operator overloading function as friend.
friend ostream& operator<<(ostream& out, int x) { out << names[x] << " " << ages[x] <<endl; return out; }