I try to compile the following with g++ 4.7.2:
template <typename T>
struct A {
struct B {
T t;
template<T B::*M>
T get() {
return this->*M;
}
};
B b;
T get() {
return b.get<&B::t>();
}
};
int main() {
A<int> a;
a.get();
}
It gives me
test.cpp: In member function ‘T A<T>::get()’:
test.cpp:15:23: error: expected primary-expression before ‘)’ token
test.cpp: In instantiation of ‘T A<T>::get() [with T = int]’:
test.cpp:22:8: required from here
test.cpp:15:23: error: invalid operands of types ‘<unresolved overloaded function type>’ and ‘int A<int>::B::*’ to binary ‘operator<’
Why?
Thanks.
You need to use the template
disambiguator:
return b.template get<&B::t>();
Without it, when parsing the expression:
b.get<&B::t>();
The compiler can't tell whether it should interpret get
as the name of a member variable followed by a <
sign (less-than), or as the instantiation of a member function template called get
.
Although we know what is the intended meaning of our expression, the compiler cannot, at least not before instantiation occurs - and syntactic parsing is performed even though your function is never instantiated.
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