gpt4 book ai didi

c++ - C++类中的运算符重载函数

转载 作者:行者123 更新时间:2023-11-28 00:49:51 24 4
gpt4 key购买 nike

这是我的独立运算符重载函数。

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

这里我有两个运算符重载函数。

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
}

现在我遇到了以下错误。

error: ‘std::istream& FileHandler1::operator>>(std::istream&, record_t&)’ must take exactly one argument

我该如何修复这个错误?

最佳答案

二元运算符,例如operator>>,可以实现为非成员函数或成员函数。当它作为非成员函数实现时,它有两个参数,假设是 TU。当它作为成员函数实现时,它接受一个参数 - 只是 U - 左操作数是它所属的类的类型。

即执行t >> u,其中operator>>T的成员,调用t.operator >>(u).

在这里,您试图让 operator>> 成为 FileHandler1 的成员,即使 >>> 的左操作数不是那种类型的。如果您被允许,运算符必须是 istream 的成员,但这不取决于您,因为它是标准类型。您必须将这些函数作为非成员函数来实现。

如果您确实FileHandler1operator>> 成员,则必须使用单个参数声明它:

FileHandler1& operator >> ( U& right_operand );

然后您必须将它与 FileHandler1 对象一起用作左操作数:

FileHandler1 fh;
U u;
fh >> u; // Equivalent to fh.operator>>(u)

关于c++ - C++类中的运算符重载函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14687779/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com