шаблонные функции переменной длины не считаются гражданами 3-го класса. Когда у вас есть
template<class T, size_t N>
ostream& vector_insert_impl(ostream& lhs, const char*, const T& rhs)
и
template<class T, size_t N, size_t... I>
ostream& vector_insert_impl(ostream& lhs, const char* delim, const T& rhs)
тогда, когда у вас осталось 1 значение, у вас есть выбор между первой функцией и последней функцией с пустой упаковкой. Нет предпочтения ни одному, поэтому у вас неоднозначный вызов. Они могут решить эту проблему, чтобы сделать так, чтобы переменная не могла быть вызвана, если пакет пуст. Вы можете сделать это, добавив второй нетипичный параметр, чтобы он вызывался только при наличии 2 или более значений, таких как
template<class T, size_t N, size_t M, size_t... I>
ostream& vector_insert_impl(ostream& lhs, const char* delim, const T& rhs)
{
return vector_insert_impl<T, M, I...>(lhs << at(rhs, N) << delim, delim, rhs);
}
Так что теперь, когда I
пусто, у вас есть vector_insert_impl<T, M>
- это то, что вызывается, и единственная перегрузка, которая действительна для этого, является первой.
Что такое граждане 3-го класса, это старые функции в стиле Си. void foo(int, ...)
не будет неоднозначным с void foo(int, int)
.