0

これは、スタンドアロンのオペレーター オーバーロード関数です。

#include <fstream>
#include <iostream>
#include <sstream>
#include <string>
#include <vector>
using namespace std;

typedef vector <string> record_t;
typedef vector <record_t> data_t;

istream& operator >> ( istream& ins, record_t& record )
  {

  record.clear();
  string line;
  getline( ins, line );
  stringstream ss( line );
  string field;
  while (getline( ss, field, '\t' ))
    {
    stringstream fs( field );
    string f("");  // (default value is 0.0)
    fs >> f;
    record.push_back( f );
    }
  return ins;
  }

istream& operator >> ( istream& ins, data_t& data )
  {

  data.clear();
  record_t record;
  while (ins >> record)
    {
    data.push_back( record );
    }
  return ins;  
  }

int main()
  {
  // Here is the data we want.
  data_t data;

  ifstream infile( "split.idx" );
  infile >> data;

  if (!infile.eof())
    {
    cout << "Fooey!\n";
    return 1;
    }

  infile.close();

  // Otherwise, list some basic information about the file.
  cout << "Your CSV file contains " << data.size() << " records.\n";

  return 0;
  }

ここには、2 つの演算子のオーバーロード関数があります。

istream& operator >> ( istream& ins, record_t& record )
istream& operator >> ( istream& ins, data_t& data )

ここで、関数をクラス形式で書きたいと思います。そこで、("Headers.h") というヘッダー ファイルで typedef データとレコード変数を宣言しました。

typedef vector <string> record_t;
typedef vector <record_t> data_t;

今、私はクラスを書きました。FileHandler1.h

#ifndef _FILEHANDLER
#define _FILEHANDLER
#endif

class FileHandler1
{

    public : 


        istream& operator >> ( istream& ins, record_t& record );

        istream& operator >> ( istream& ins, data_t& data );

};

FileHandler1.cpp

#include "Headers.h"
#include "FileHandler1.h"
istream& FileHandler1:: operator >> ( istream& ins, record_t& record )
{
//Same set of code I posted initially 
}

istream& FileHandler1:: operator >> ( istream& ins, data_t& data )
{
// Same set of code  
}

今、私は以下のエラーを得ました。

エラー: 'std::istream& FileHandler1::operator>>(std::istream&, record_t&)' は 1 つの引数を取る必要があります

このバグを修正するにはどうすればよいですか?

4

2 に答える 2

3

などの二項演算子はoperator>>、非メンバー関数またはメンバー関数として実装できます。T非メンバー関数として実装されている場合、との 2 つの引数を取りますU。メンバー関数として実装されている場合、引数は 1 つだけUで、左側のオペランドはメンバーであるクラスの型です。

つまりt >> uoperator>>が のメンバーである を実行するとT、 が呼び出されますt.operator>>(u)

ここでは、 の左オペランドがそのタイプではないにもかかわらず、operator>>のメンバーを作成しようとしています。許可されている場合、演算子は のメンバーである必要がありますが、それは標準型であるため、あなた次第ではありません。これらの関数を非メンバー関数として実装する必要があります。FileHandler1>>istream

のメンバーがある場合、単一の引数で宣言する必要があります。operator>>FileHandler1

FileHandler1& operator >> ( U& right_operand );

そして、FileHandler1オブジェクトを左オペランドとして使用する必要があります。

FileHandler1 fh;
U u;
fh >> u; // Equivalent to fh.operator>>(u)
于 2013-02-04T13:32:18.970 に答える
0

クラスの入力演算子は、クラス インスタンス入力ストリームである場合に使用されます。たとえば、あなたの場合:

FileHandler1 fh1;
fh1 >> something;

上記は次のように変換されます。

fh1.operator>>(something);

これが、メンバー入力演算子が引数を 1 つしかとらない理由であり、これはエラー メッセージに示されています。

これはあなたが望んでいるようには見えないので、入力演算子を独立した関数として保持する必要があります。

于 2013-02-04T13:32:30.947 に答える