为模板重载 +=?

Overload += for a template?

我有一个基础 class Animal 和一个衍生 class Bird : Animal。我使用一个模板 class 来存储指向 AnimalBird 对象的指针向量。我想重载 += 运算符,这样我就可以在 Atlas 中插入一个新的 animal,所以 m_length = m_length + 1pages.push_back(animal) 只是为了明白了。

这是我的模板 class:

template <class T>
class Atlas2 {
 public:
  int m_length;
  std::list<T> pages;
  Atlas2() { m_length = 0; }
  ~Atlas2() {}
  void adauga(T data);
  T operator+=(const T& data) {
    this->m_length++;
    this->pages.push_back(data);
    return *this;
  };
};

这是 Animal/Bird classes:

class Animal {
 protected:
  std::string m_name;

 public:
  Animal() {}
  Animal(std::string name) : m_name{name} {}
  virtual void set_name(std::string name) { m_name = name; }
  virtual std::string get_name() { return m_name; }
  virtual std::string regn() const { return "???"; }

  virtual ~Animal() { cout << "Destructor animal" << '\n'; }
};

class Bird : public Animal {
 public:
  bird() : animal() {}
  bird(std::string name) : Animal{name} {}
  void set_name(std::string nume) { m_name = nume; }

  std::string get_name() { return m_name; }

  std::string regn() const override { return "pasare"; }
  ~bird() { cout << "destructor pasare" << '\n'; }
};

但是,我想不通。当我像这样在 main() 中使用重载的 += 运算符时:

Pasare *c = new Pasare{"vulture"};
Atlas2<Animal *> Atlas;
Atlas += c;    

它向我显示了一个错误,无法将 Atlas<Animal *> 转换为 <Animal*>

我该如何正确实施?有什么建议吗?

注意:模板工作正常,我可以毫无问题地在我的列表中存储指向 AnimalBirds 的指针,并访问它们的特定方法。我就是想不通 += 部分。

基本问题是您已将 operator+= 声明为 returning a T,但其中的 return 语句是 return *this; , 这是一个 Atlas2<T>.

如果将 return 类型更改为 Atlas2<T> &,它应该可以工作。无论如何,这就是您通常希望从 operator+= 中 return 的内容,尽管在您的使用中,这并不重要,因为您忽略了 returned 值。

你应该 return Atlas2<T> & 而不是 T:

Atlas2<T>& operator+=(const T& data) {
    this->m_length++;
    this->pagini.push_back(data);
    return *this;
};