I don't get it, it seems to me that the call to f
is completely unambiguous, but it fails to compile with expected primary-expression before ‘int’
. If I comment out the line with the call to f
, it compiles fine.
template<typename T> struct A { template<typename S> void f() { } }; template<typename T> struct B : A<T> { void g() { this->f<int>(); } };
Defining a Function TemplateA function template starts with the keyword template followed by template parameter(s) inside <> which is followed by the function definition. In the above code, T is a template argument that accepts different data types ( int , float , etc.), and typename is a keyword.
Which parameter is legal for non-type template? Explanation: The following are legal for non-type template parameters:integral or enumeration type, Pointer to object or pointer to function, Reference to object or reference to function, Pointer to member.
A template parameter is a special kind of parameter that can be used to pass a type as argument: just like regular function parameters can be used to pass values to a function, template parameters allow to pass also types to a function.
You cannot define a virtual template method. override only works for virtual methods, and you can only override methods with the same signature. method<bool>() is not the same as method<int>() .
This is due to a really obscure provision of the standard in which if you have a template that tries to access a template function in an object whose type depends on a template argument, you have to use the template
keyword in a weird way:
this->template f<int>();
This is similar to the weirdness with typename
that comes up with dependent types, except as applied to functions. In particular, if you leave out the template
keyword, there's a parsing ambiguity between
this->f<int>()
(what you intended), and
((this->f) < int) > ()
which makes no sense (hence your error). The use of the keyword template
here disambiguates and forces the compiler to recognize that it's looking at a perfectly valid call to a templated member function rather than a garbled mass of symbols.
Hope this helps!
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With