1. ホーム
  2. c++

[解決済み】演算子のオーバーロード C++; <<操作のパラメータが多すぎる

2022-01-28 23:25:57

質問

以下のようなコードで、いくつかの名前と年齢を受け取り、いくつかの処理を行います。最終的にはそれらをプリントアウトします。私は私の print() 関数に、グローバルな operator<< . 私は見た 別のフォーラムで その <<operator は2つのパラメータを取りますが、私がそれを試したとき、私は "too many parameters for << 操作エラーが表示されました。何か間違ったことをしているのでしょうか?私は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;
    }
};

解決方法は?

オーバーロードしている << 演算子をメンバ関数として使用します。したがって、最初のパラメータは暗黙のうちに呼び出し元のオブジェクトとなります。

としてオーバーロードする必要があります。 friend 関数として、あるいは自由関数として使用できます。例えば

としてオーバーロードする friend 関数を使用します。

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

しかし、正規の方法は、これを free 関数を使用します。この投稿は非常に良い情報を提供しています。 C++の演算子のオーバーローディング