Почему foo (5) не работает, а foo (5) работает?
Поскольку компилятор не может определить, что такое T
[из foo(5)
].
Вы можете оставить только аргументы шаблона конца, а не начала или середины:
Например:
template<typename T, typename U>
void foo(T t)
{
}
template<typename T, typename U>
void bar(U u)
{
}
int main()
{
foo<int>(5); // Error!! Compiler cannot decide what `U` is
foo<int, int>(5); // Works!!
bar<int>(5); // Works!! `U` deduced from `5` (int)
bar<int, int>(5); // Works!!
}