Ich habe einen benutzerdefinierten istream erstellt, der von std :: istream abgeleitet wurde und einen benutzerdefinierten streambuf verwendet, wenn die Datei eine gezippte Datei und ansonsten std :: filebuf ist.Zuweisen der abgeleiteten Klasse unique_ptr zur Basisklasse unique_ptr
#mystream.h
class my_stream: public istream {
public:
explicit my_stream(const std::string &path);
private:
std::unique_ptr<std::streambuf> b_;
}
#mystream.cpp
my_stream::my_stream(const std::string &path) :std::istream(nullptr) {
if(path.substr(path.length()-6, path.length())==".gzip"){
b_ = std::make_unique<gzipbuf>(path); //gzipbuf is derived from std::streambuf
}
else {
std::unique_ptr<std::filebuf> fb;
fb->open(path.c_str(), std::ios::in);
b_ = fb;
}
this->init(b_.get());
}
Ich bin in der Lage abgeleiteten Klasse unique_ptr zu Basisklasse unique_ptr an einem Ort zuordnen
b_ = std::make_unique<gzipbuf>(path);
aber nicht auf der anderen
b_ = fb;
Es sagt Kandidat Funktion nicht lebensfähig: nein bekannte Konvertierung von 'unique_ptr' zu 'unique_ptr, default_delete' für das erste Argument operator = (unique_ptr & & __u) noexcept
Sie müssen * Umzug * es: 'b = std :: move (fb);' denn hier kann immer nur sein, eine (keine Kopien). – Galik