为模板重载 +=?
Overload += for a template?
我有一个基础 class Animal
和一个衍生 class Bird : Animal
。我使用一个模板 class 来存储指向 Animal
或 Bird
对象的指针向量。我想重载 +=
运算符,这样我就可以在 Atlas
中插入一个新的 animal
,所以 m_length = m_length + 1
、pages.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*>
。
我该如何正确实施?有什么建议吗?
注意:模板工作正常,我可以毫无问题地在我的列表中存储指向 Animal
或 Birds
的指针,并访问它们的特定方法。我就是想不通 +=
部分。
基本问题是您已将 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;
};
我有一个基础 class Animal
和一个衍生 class Bird : Animal
。我使用一个模板 class 来存储指向 Animal
或 Bird
对象的指针向量。我想重载 +=
运算符,这样我就可以在 Atlas
中插入一个新的 animal
,所以 m_length = m_length + 1
、pages.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*>
。
我该如何正确实施?有什么建议吗?
注意:模板工作正常,我可以毫无问题地在我的列表中存储指向 Animal
或 Birds
的指针,并访问它们的特定方法。我就是想不通 +=
部分。
基本问题是您已将 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;
};