Я пытаюсь скомпилировать следующее с 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();
}
Это дает мне
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<’
Зачем?
Благодарю.
Вам нужно использовать template
disambiguator:
return b.template get<&B::t>();
Без этого при разборе выражения:
b.get<&B::t>();
Компилятор не может сказать, должен ли он интерпретировать get
как имя переменной-члена, сопровождаемой <
знак (меньше) или как экземпляр шаблона функции-члена с именем get
,
Хотя мы Знать, что подразумевается под нашим выражением, компилятор не может, по крайней мере, до того, как произойдет его создание — и синтаксический анализ выполняется, даже если ваша функция никогда не создается.
Других решений пока нет …