Function must have exactly one argument

2020-04-16 05:23发布

问题:

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 ?

回答1:

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


回答2:

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.



标签: c++ function