2013-04-30 7 views
7

У меня есть код ниже, который займет несколько имен и возрастов и с ними что-нибудь сработает. В конце концов он распечатает их. Мне нужно изменить мою функцию print() с глобальным operator<<. Я видел on a different forum, что <<operator принимает два параметра, но когда я пытаюсь, я получаю «слишком много параметров для ошибки < <. Есть ли что-то, что я делаю неправильно? Я новичок в C++, и я действительно не понимаю смысла оператора перегрузка.Перегрузка оператора C++; слишком много параметров для << операции

#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; 
    } 
}; 

ответ

12

Вы перегрузка << оператора в качестве функции члена, следовательно, первый параметр неявно вызывающий объект.

Вы должны либо перегрузить его в качестве friend функции или в виде свободной функции. Например, :

перегрузка как friend функция.

friend ostream& operator<<(ostream& out, int x){ 
    out << names[x] << " " << ages[x] <<endl; 
    return out; 
} 

Однако канонический путь перегружать его как free функции. Вы можете найти очень хорошую информацию из этого сообщения: C++ operator overloading

1
declare operator overloading function as friend. 

friend ostream& operator<<(ostream& out, int x) 
{ 
     out << names[x] << " " << ages[x] <<endl; 
     return out; 
} 
Смежные вопросы