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.
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 togetResultinsideprintStuffshould lookThis is similar to using the keyword
typenamewhen referring to nested typenames in a dependent type. For some reason, the bit abouttypenamewith nested types is rather well-known, but the similar requirement fortemplatewith nested templates is relatively unknown.Note that the general syntax structure is a bit different though. The
typenameis always put in front of the full name of the type, whiletemplateis 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
AinprintStuff. When you callfoo.getResult<>inmainthe type offoois not dependent, so there’s no need to include thetemplatekeyword.