Рассмотрим следующий код:
struct bar
{
template <typename U>
void fun0() const {}
};
template <typename T>
struct foo
{
void
fun1(const bar& d)
{
// (1) KO
fun2(d).fun0<int>();
// (2) OK
fun2(d).template fun0<int>();
// (3) OK
d.fun0<int>();
}
bar
fun2(const bar& d)
{
return d;
}
};
Строки (2) и (3) компилируются, но (1) не выполняется:
error: use 'template' keyword to treat 'fun0' as a dependent template name
fun2(d).fun0<int>();
^
template
(Как и ожидалось, если foo
больше не является шаблонной структурой, (1) также компилируется)
Почему bar::fun0
имя зависимого шаблона здесь? bar
не зависит от параметра шаблона T
от foo
.
Edit:
Ясно, что bar::fun2
отвечает за двусмысленность, с которым имеет дело .template
. Например, добавьте две следующие свободные функции:
bar
fun3(const bar& d)
{
return d;
}
template <typename T>
T
fun4(const T& d)
{
return d;
}
fun3(d).fun0<int>()
и fun4(d).fun0<int>()
) также компилируются в контексте foo::fun1
. Таким образом, неоднозначность вызвана параметром шаблона foo
.
Почему fun2(d).fun0<int>()
не анализируется как вызов шаблона функции-члена?