Вам необходимо ключевое слово template
:
return A<X>::template call<int>();
call
- это зависимое имя, означающее, что его значение зависит от параметра шаблона, который неизвестен, когда процесс компилятора f()
.Необходимо указать, что call
является шаблоном функции, добавив к нему префикс с ключевым словом template
.
То же самое происходит при попытке доступа к вложенному типу: необходимо добавить ключевое слово typename
чтобы указать, что имя обозначает тип:
template <typename T>
struct A { typedef int type; };
template <typename T>
void f()
{
typename A<T>::type i = 0; // notice "typename" here
}
И иногда вам даже нужно смешать оба:
template <typename T>
struct A
{
template <typename U>
struct inner { };
};
template <typename T>
void f()
{
typename A<T>::template inner<int> var;
}
Использование этих двух ключевых слов подробно объясняется в ответах на этот вопрос.вопрос: Где и почему я должен поставить ключевые слова «template» и «typename»? (спасибо @ Björn Pollex за поиск ссылки).