2016-09-08 4 views
1

Я создаю C++ istream с пользовательским streambuf. Пытаться переместить это не удается, потому что конструктор перемещения istream защищен. Чтобы обойти это я вывел класс от istream:Перемещение класса, полученного из istream

struct VectorCharBuf : public streambuf { 
    VectorCharBuf(vector<char>& v) { 
     setg(v.data(), v.data(), v.data() + v.size()); 
    } 
}; 

struct IVectorCharStream : public istream { 
    IVectorCharStream(VectorCharBuf* contents_buf) : istream(contents_buf) {} 
}; 

конструктор двигаться по умолчанию для этого класса не создается, поскольку он предполагает использование удаленной функции «СТД :: basic_ios < _CharT в

, _Traits> :: basic_ios (const std :: basic_ios < _CharT, _Traits> &) [с _CharT = char; _Traits = станд :: char_traits]

Кроме того, если я пытаюсь объявить конструктор перемещения явно, как в

struct MyIStream : public istream { 
    MyIStream(MyIStream&& str) : istream(move(str)) {} 
}; 

Я получаю ошибку „недопустимое использование пустого выражения“. (Я, наверное, делаю что-то глупое в этом последнем случае, но я просто не могу это заметить ...)

Как создать подвижный istream?

+1

Почему вы пытаетесь перенести фактический 'std :: istream' в первую очередь? Это вряд ли звучит полезно. –

+1

@BaummitAugen, поэтому вы можете его инициализировать с помощью 'auto variable = MyIstream {};'? – utnapistim

+0

Тогда что вы собираетесь делать с 'переменной'? 'std :: istream' - это просто базовая база, она фактически не делает ничего полезного сама по себе. –

ответ

3
struct MyIStream : public istream { 
    MyIStream(MyIStream&& str) : istream(move(str)) {} 
}; 

я получаю ошибку «недопустимое использование void expression ".

Это не работает, потому что basic_ios, базовый класс istream содержит функцию-член void move(basic_ios& _Other) (для перемещения базового класса).

Если вы используете std::move(str) в конструкторе, он компилируется!

1

Как создать подвижный istream?

Вы можете реализовать свой класс в терминах базового класса конструктор по умолчанию, вместо перемещения конструктора базы:

struct MyIStream : public istream { 
    MyIStream(MyIStream&& str) 
    : istream() 
    { 
     // todo: implement move functionality from str 
    } 
};