Каждый класс имеет неявно объявленный конструктор копирования , если вы его не объявляете, но только если каждый член данных и унаследованный тип могут быть созданы копированием. std::ostringstream
не имеет конструктора копирования, поэтому компилятор не может сгенерировать конструктор копирования для Reading
.
Вы можете определить конструктор копирования самостоятельно, если вы можете определить способ построения Reading::payloadString
осмысленным способом . Например, вы можете сделать что-то вроде:
Reading(Reading const & other) :
elevation{other.elevation},
payloadString{other.payloadString.str()},
speed{other.speed} { }
Обратите внимание, что это копирует строковое значение, содержащееся в other.payloadString
, но не копирует другие аспекты потока, такие как его различные режимы вывода или его положение вывода. . В вашем случае этого может быть достаточно.
Если вы определяете этот конструктор, вы также можете определить операцию копирования-присваивания, которая не может быть автоматически сгенерирована по той же причине. Вы можете имитировать c семантику конструктора копирования выше:
Reading & operator=(Reading const & other) {
elevation = other.elevation;
payloadString = std::ostringstream{other.payloadString.str()};
speed = other.speed;
return *this;
}
Обратите внимание, что std::ostringstream
можно перемещать, , что означает, что компилятор автоматически сгенерирует конструктор перемещения и оператор присваивания перемещения для Reading
. Следовательно, вы можете просто переместить-построить элемент списка из fakeReading
:
readingsList.emplace_back(std::move(fakeReading));
Если вы решите реализовать конструктор / присваивание копирования, то компилятор не сгенерирует перемещение конструктор / назначение для вас, и вам нужно будет явно указать компилятору, чтобы они сгенерировали их:
Reading(Reading &&) = default;
Reading & operator=(Reading &&) = default;