I'm attempting to figure out why some code that I have won't compile and I done a fair bit of reduction an anonymizing to end up with this example:
#define NULL ((void*)0)
template<typename T>
class a {
public:
template<bool b>
T * amem() {
return NULL;
}
};
template<typename T>
class b {
public:
a<T>* ap;
template <bool b>
T * m() {
return ap->amem<b>();
}
};
int main()
{
return 0;
}
Depending on the compiler that I use and the names of the variables I get different errors. They are all centered around this line, though:
return ap->amem<b>();
Compiling using clang++ [Apple clang version 4.0 (tags/Apple/clang-421.0.57) (based on LLVM 3.1svn)], I get the following message:
tmp.cpp:18:26: error: expected expression
return ap->amem<b>();
^
1 error generated.
Compiling using g++ [i686-apple-darwin11-llvm-g++-4.2 (GCC) 4.2.1], I get the following message:
tmp.cpp: In member function ‘T* b<T>::m()’:
tmp.cpp:18: error: expected primary-expression before ‘>’ token
tmp.cpp:18: error: expected primary-expression before ‘)’ token
Mysteriously (to me, anyway). If I change the name of amem to m, I no longer get any errors from g++, but I get the same error from clang++.
I'm sure there is something here that I just don't understand? Does anyone know what expression clang and gcc are looking for? Does anyone know how to solve this problem?
If this is a compiler bug (seems doubtful), does anyone know any workarounds that don't involve converting amem into a function with a bool parameter (rather than a template)? I've done this already and I can confirm that this works around the issue, but this is inside a hot loop and the code that is switched on by b is a memory allocation that probably shouldn't be in a hot loop.