функция-член шаблона класса шаблона вызывается из функции шаблона - PullRequest
45 голосов
/ 03 декабря 2009

Это не компилируется:

template<class X> struct A {
   template<int I> void f() {}
};

template<class T> void g()
{
   A<T> a;
   a.f<3>();  // Compilation fails here (Line 18)
}

int main(int argc, char *argv[])
{
   g<int>();  // Line 23
}

Компилятор (GCC) говорит:

hhh.cpp: в функции 'void g ()':

hhh.cpp: 18: ошибка: ожидаемое первичное выражение до токена ')'

hhh.cpp: в функции 'void g () [with T = int]':

hhh.cpp: 23: создан здесь

hhh.cpp: 18: ошибка: неправильное использование члена (вы забыли '&'?)

Кто-нибудь может объяснить, почему это так? Есть ли способ заставить его работать?

1 Ответ

78 голосов
/ 03 декабря 2009

Попробуйте следующий код:

template<class T> void g()
{
   A<T> a;
   a.template f<3>();  // add `template` keyword here
}

В соответствии со стандартом C ++ '03 14.2 / 4:

Когда имя специализации шаблона элемента появляется после . или -> в выражении с постфиксом или после спецификатора вложенного имени в квалифицированный идентификатор , а постфиксное выражение или квалифицированный идентификатор явно зависит от параметра-шаблона (14.6.2), имя шаблона элемента должно начинаться с ключевого слова template. В противном случае предполагается, что имя не является шаблоном.

В будущем стандарте C ++, по-видимому, все еще требуется это ключевое слово в соответствии с черновиком n2857 14.3 / 4. Некоторые компиляторы имеют специальный режим, который позволяет скомпилировать оригинальный код без ошибок (Comeau компилирует его в так называемом расслабленном режиме ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...