I've not coded in C++ for a long time and I'm trying to fix some old code.
I'm geting the error:
TOutputFile& TOutputFile::operator<<(TOutputFile&, T)' must have exactly one argument
on the following code:
template<class T>
TOutputFile &operator<<(TOutputFile &OutFile, T& a);
class TOutputFile : public Tiofile{
public:
TOutputFile (std::string AFileName);
~TOutputFile (void) {delete FFileID;}
//close file
void close (void) {
if (isopened()) {
FFileID->close();
Tiofile::close();
}
}
//open file
void open (void) {
if (!isopened()) {
FFileID->open(FFileName, std::ios::out);
Tiofile::open();
}
}
template<class T>
TOutputFile &operator<<(TOutputFile &OutFile, const T a){
*OutFile.FFileID<<a;
return OutFile;
}
protected:
void writevalues (Array<TSequence*> &Flds);
private:
std::ofstream * FFileID;
};
What's is wrong with that operator overloading ?
Check the reference
The overloads of operator>>
and operator<<
that take a std::istream&
or std::ostream&
as the left hand argument are known as insertion and
extraction operators. Since they take the user-defined type as the
right argument (b in a@b), they must be implemented as non-members.
Hence, they must be non-member functions, and take exactly two arguments when they are meant to be stream operators.
If you are developing your own stream class, you can overload operator<<
with a single argument as a member function. In this case, the implementation would look something like this:
template<class T>
TOutputFile &operator<<(const T& a) {
// do what needs to be done
return *this; // note that `*this` is the TOutputFile object as the lefthand side of <<
}
Operator overloaded functions which are defined as member functions accept only one parameter. In case of overloading <<
operator, more than one parameter is required. Making it a friend
function solves this issue.
class {
...
friend TOutputFile &operator<<(TOutputFile &OutFile, const T &a);
...
};
template<class T>
TOutputFile &operator<<(TOutputFile &OutFile, const T &a) {
*OutFile.FFileID << a;
return OutFile;
}
A function marked as friend
will allow that function to access private member of the class to which it is a friend.