Функция должна иметь ровно один аргумент - PullRequest
2 голосов
/ 21 мая 2019

Я давно не кодировал в C ++ и пытаюсь исправить какой-то старый код.

Я получаю сообщение об ошибке:

TOutputFile& TOutputFile::operator<<(TOutputFile&, T)' must have exactly one argument

на следующемкод:

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;         


};

Что не так с перегрузкой этого оператора?

Ответы [ 2 ]

5 голосов
/ 21 мая 2019

Проверьте ссылку

Перегрузки operator>> и operator<<, которые принимают std::istream& или std::ostream& в качестве левого аргумента известны как вставка и операторы добычи. Так как они принимают пользовательский тип как правильный аргумент (b в a @ b), они должны быть реализованы как не-члены .

Следовательно, они должны быть функциями, не являющимися членами, и принимать ровно два аргумента, если они предназначены для потоковых операторов.

Если вы разрабатываете свой собственный класс потока, вы можете перегрузить operator<< с единственным аргументом в качестве функции-члена . В этом случае реализация будет выглядеть примерно так:

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 <<
}
0 голосов
/ 21 мая 2019

Перегруженные оператором функции, которые определены как функции-члены, принимают только один параметр.В случае перегрузки оператора << требуется более одного параметра.Создание функции friend решает эту проблему.

class {
    ...
    friend TOutputFile &operator<<(TOutputFile &OutFile, const T &a);
    ...
};

template<class T>
TOutputFile &operator<<(TOutputFile &OutFile, const T &a) {
    *OutFile.FFileID << a;
    return OutFile;
}

Функция, помеченная как friend, позволит этой функции получить доступ к закрытому члену класса, другу которого она является.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...