I've been playing with clang a while, and I stumbled upon "test/SemaTemplate/dependent-template-recover.cpp" (in the clang distribution) which is supposed to provide hints to recover from a template error.
The whole thing can be easily stripped down to a minimal example:
template<typename T, typename U, int N> struct X {
void f(T* t)
{
// expected-error{{use 'template' keyword to treat 'f0' as a dependent template name}}
t->f0<U>();
}
};
The error message yielded by clang:
tpl.cpp:6:13: error: use 'template' keyword to treat 'f0' as a dependent template name
t->f0<U>();
^
template
1 error generated.
... But I have a hard time understanding where exactly one is supposed to insert the template
keyword to have the code to be syntactically correct?
ISO C++03 14.2/4:
When the name of a member template specialization appears after . or -> in a postfix-expression, or after nested-name-specifier in a qualified-id, and the postfix-expression or qualified-id explicitly depends on a template-parameter (14.6.2), the member template name must be prefixed by the keyword template. Otherwise the name is assumed to name a non-template.
In t->f0<U>();
f0<U>
is a member template specialization which appears after ->
and which explicitly depends on template parameter U
, so the member template specialization must be prefixed by template
keyword.
So change t->f0<U>()
to t->template f0<U>()
.