#include <iostream>
using namespace std;
class pop {
int x;
public:
int getX() {
return x;
}
pop() : x{ 0 } {}
pop operator + (pop& p) {
return pop(this->x + p.x);
// здесь ошибка E0289: отсутствуют экземпляры конструктора pop::pop,
// соответствуюшие списку аргументов; и всегда у меня ошибки с
// перегрузкой в vs
}
};
Вам нужен конструктор для класса pop, который принимает один параметр типа int. Вы в вашем return пытаетесь использовать именно его, но создать его вы забыли.
Этот конструктор может быть отдельным конструктором, но можно, если вам понравится, воспользовавшись аргументами по умолчанию, написать один общий конструктор: и для конструкции из int, и для конструкции по умолчанию
pop(int x = 0) : x{ x } {}
Также, если вы не объявите такой конструктор explicit, то он будет конструктором преобразования и в реализации вашего оператора вы сможете, при желании, просто написать
return x + p.x;
Но это дело вкуса.
Бинарный оператор сложения лучше реализовывать самостоятельной (возможно дружественной) функцией, а не методом класса, как у вас. Однако даже при реализации методом класса не стоит забывать о константной корректности
pop operator + (const pop& p) const
и, конечно
int getX() const
Если вы предоставите конструктор конверсии из типа int, вы сразу же сможете также выполнять сложения вида
pop a, b;
a = b + 5;
// Автоматически рассматривается компилятором как `b + pop(5)`
Однако из-за того, что оператор сложения у вас реализован методом класса, вы не сможете выполнять сложения вида
a = 5 + b;
Реализация оператора сложения самостоятельной функцией была бы свободна от этого недостатка.
Как развивать веб-проекты в 2026 году: технологии, контент E-E-A-T и факторы доверия
Современные инструменты для криптотрейдинга: как технологии помогают принимать решения
Апостиль в Лос-Анджелесе без лишних нервов и бумажной волокиты
Основные этапы разработки сайта для стоматологической клиники