This is a minimal test case of some code that I actually have. It fails when it tries to evaluate a.getResult<B>()
:
test.cpp: In function 'void printStuff(const A&)':
test.cpp:6: error: expected primary-expression before '>' token
test.cpp:6: error: expected primary-expression before ')' token
The code is:
#include <iostream>
template< class A, class B>
void printStuff( const A& a)
{
size_t value = a.getResult<B>();
std::cout << value << std::endl;
}
struct Firstclass {
template< class X >
size_t getResult() const {
X someInstance;
return sizeof(someInstance);
}
};
int main(int, char**) {
Firstclass foo;
printStuff<Firstclass, short int>(foo);
printStuff<Firstclass, double>(foo);
std::cout << foo.getResult< double >() << std::endl;
return 0;
}
If I comment out the printStuff
function and where it's called, the foo.getResult< double >()
call compiles fine and does what is expected.
Any idea what's going on? I've been working with extensively templated code for a while and have never encountered anything like this.
Member functions can be function templates in several contexts. All functions of class templates are generic but are not referred to as member templates or member function templates. If these member functions take their own template arguments, they are considered to be member function templates.
No, template member functions cannot be virtual.
For normal code, you would use a class template when you want to create a class that is parameterised by a type, and a function template when you want to create a function that can operate on many different types.
Explanation: As a template feature allows you to write generic programs. therefore a template function works with any type of data whereas normal function works with the specific types mentioned while writing a program.
When you refer to a template that is a member of dependent type, you have to prepend it with a keyword template
. This is how the call to getResult
inside printStuff
should look
size_t value = a.template getResult<B>();
This is similar to using the keyword typename
when referring to nested typenames in a dependent type. For some reason, the bit about typename
with nested types is rather well-known, but the similar requirement for template
with nested templates is relatively unknown.
Note that the general syntax structure is a bit different though. The typename
is always put in front of the full name of the type, while template
is inserted in the middle.
Again, this is only necessary when you are accessing a template member of a dependent type, which in the above example would be A
in printStuff
. When you call foo.getResult<>
in main
the type of foo
is not dependent, so there's no need to include the template
keyword.
Your code is ill-formed according to C++ Standard 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 keywordtemplate
. Otherwise the name is assumed to name a non-template.
So, you should write size_t value = a.template getResult<B>();
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