类c ++中的运算符重载函数
这是我独立的运算符重载功能。
#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 )
现在我希望以类格式编写函数。 所以我在头文件中声明了typedef数据和记录变量(“Headers.h”)
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&)'必须只有一个参数
我该如何解决这个错误?
二元运算符(如operator>>
)可以作为非成员函数或成员函数来实现。 当它作为非成员函数实现时,它需要两个参数,比如说T
和U
当它作为一个成员函数实现时,它只需要一个参数 - 只需U
- 左操作数就是它所属的类的类型。
也就是说,在t >> u
, operator>>
是T
的成员,调用t.operator>>(u)
。
在这里,尽管>>
的左操作数不是这种类型,但您试图使operator>>
成为FileHandler1
的成员。 如果你被允许,运营商必须是istream
的成员,但这不是你自己的,因为它是一个标准类型。 你必须将这些功能作为非成员函数来实现。
如果你有一个FileHandler1
的operator>>
成员,它将不得不用一个参数声明:
FileHandler1& operator >> ( U& right_operand );
然后,您必须将其与FileHandler1
对象一起用作左操作数:
FileHandler1 fh;
U u;
fh >> u; // Equivalent to fh.operator>>(u)
类中的输入操作符用于当类实例是输入流时。 例如在你的情况下:
FileHandler1 fh1;
fh1 >> something;
以上转化为:
fh1.operator>>(something);
这就是成员输入操作符只接受一个参数的原因,这是错误消息告诉你的。
这似乎并不是你想要的,所以你必须保持输入操作符为独立函数。
链接地址: http://www.djcxy.com/p/73103.html上一篇: Operator overloading function in class c++
下一篇: operator overload <<