У меня есть следующий код:Weird разрешения перегрузки с функцией VARIADIC шаблоны
#include <iostream>
template <typename... Args>
void f(int a, int b, Args... args) {
std::cout << b << '\n';
f(a, args...);
}
void f(int, int b) {
std::cout << b << '\n';
}
int main() {
f(1, 2);
//f(1, 2, 3);
}
f(1, 2)
В то время как компилирует, f(1, 2, 3)
не делает. Из сообщения об ошибке, созданного компилятором, я вижу, что каким-то образом создается экземпляр f<>
. Внутри экземпляра создается вызов f(a)
и, следовательно, ошибка. Что заставляет компилятор не использовать f(int, int)
, но попытаться создать экземпляр f<>(int, int)
во время разбора вызова f(1, 2, 3)
?
Изменить порядок объявлений. То есть поставьте свою перегрузку * сначала *, затем ваш шаблон и повторите попытку. – WhozCraig