我正在尝试重载此类中的<< 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;
}

最佳答案

Pila是一个类模板,使用时需要指定模板参数。然后您可以将operator<<设为功能模板,然后

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

顺便说一句:最好通过引用传递p,以避免对包含Pilastd::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;
}

08-16 09:33