Вывод аргумента шаблона пытается вывести ostream_type
из аргумента функции. При этом он не связан указанным вами аргументом по умолчанию. Скорее аргумент по умолчанию просто игнорируется.
ostream_type
будет выведен в std::basic_ostream<char>
.
Тогда ничего не останется в зависимости от Args
в параметрах функции, а пакет параметров будетвыводится как пустой.
Пустой Args
затем раскрывается в аргумент по умолчанию ostreambuf_iterator_type = ::std::ostreambuf_iterator<Args...>
, что не удается, поскольку std::ostreambuf_iterator
требуется хотя бы один аргумент шаблона.
Если вы хотите Args
для вывода в качестве аргументов шаблона для std::basic_ofstream
, переданного вашей функции, необходимо ограничить вывод аргумента шаблона в параметре:
template <typename... Args,
typename ostreambuf_iterator_type = ::std::ostreambuf_iterator<Args...>>
auto &operator<<(::std::basic_ostream<Args...> &os, const Foo f) {
// Do ostreambuf_iterator_type stuff with 'f' here...
return os;
}
Теперь вычет должен вывести Args
какаргументы шаблона os
.