The code below fails to compile with gcc 7.1.0, which complains about providing the wrong number of template arguments in the second line of main. This version of GCC is supposed to implement template argument deduction of class templates.
I think the compiler should be able to deduce the class template argument T2 for Bar, which means that I shouldn't have to explicitly specify both arguments (Bar<int, int>
) given paragraph 17.8.1.3 of the C++17 draft which says, "Trailing template arguments that can be deduced (17.8.2) or obtained from default template-arguments may be omitted from the list of explicit template-arguments."
Am I wrong? Is the compiler wrong? Is this an oversight or a deliberate design?
template <typename T>
struct Foo {
Foo(T t) {}
};
template <typename T1, typename T2>
struct Bar {
Bar(T2 t) {}
};
template <typename T1, typename T2>
void bar(T2 t) {}
int main(int argc, char **argv) {
Foo(42); // Works
Bar<int>(42); // Fails to compile with "wrong number of
// template arguments (1, should be 2)"
bar<int>(42); // Works
}
See Question&Answers more detail:os