Имя класса не называет тип с ++ - PullRequest
1 голос
/ 05 июля 2019

Я пытаюсь перегрузить << operator в этом классе, но компилятор выдает мне Pila - это не ошибка типа (Pila будет стеком, именем класса).GetNElem - это еще одна функция, которую я не включил, не волнуйтесь.

#include <vector>
#include <iostream>
using namespace std;


template <class T>
class Pila {
 private:
  vector <T> elem;

 public:
  /* Pila(){

  } */

  Pila ( int n ) {
    elem.resize(n);
  }

  void print(ostream & f_out){
    for (int i = 0; i < getNElem(); i++)
      f_out << elem[i] << " ";
    return;
  }


};

ostream& operator << (ostream& f_out, Pila p ){
  p.print(f_out);
  return f_out;
}

1 Ответ

4 голосов
/ 05 июля 2019

Pila - это шаблон класса, вам нужно указать аргумент шаблона при его использовании. И вы можете сделать operator<< шаблоном функции, тогда

template <typename T>
ostream& operator << (ostream& f_out, Pila<T> p ){
  p.print(f_out);
  return f_out;
}

Кстати: было бы лучше передать p по ссылке, чтобы избежать операции копирования на Pila, которая содержит std::vector, и сделать print const функцией-членом.

template <class T>
class Pila {
  ...

  void print(ostream & f_out) const {
    for (int i = 0; i < getNElem; i++)
      f_out << elem[i] << " ";
  }

};

template <typename T>
ostream& operator << (ostream& f_out, const Pila<T>& p ){
  p.print(f_out);
  return f_out;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...