Ваша проблема в том, что вы неправильно перенаправляете параметры.
InflateInput<DeflateInput<File>> inflate1(0, File{"filename"}, 9, 0);
Вызывает конструктор
template<typename ...Args>
InflateInput(int header, Args ...args) : source(args...) {}
, где Args...
равно File, int, int
. Так как у args...
есть имя, целые пачки являются lvalue, но ваш DeflateInput
принимает только ссылку rvalue на File
из
DeflateInput(T &&stream, int level, int header) : source(std::move(stream)) {}
Самое простое решение - позвонить std::move
на args
как
InflateInput(int header, Args ...args) : source(std::move(args)...) {}
но на самом деле вы должны использовать пересылку ссылок вместе с std::forward
для полной пересылки всех параметров. Это изменит конструктор на
InflateInput(int header, Args&& ...args) : source(std::forward<Args>(args)...) {}