вторник, 22 декабря 2009 г.

Template keyword

Как вы думаете, что нужно написать, чтобы вызвать шаблонную фукнцию шаблонного класса из шаблонной фукнции?

Чтобы было понятно о чем идет речь, рассмотрим конкретный пример:
template<typename T> struct A {
template<int I> void f() {}
};

template<typename TT> void g()
{
A<TT> a;
a.f<3>(); // error is here
}
Код выглядит корректным, однако, строка, где указана ошибка, рассматривается компилятором как выражение со знаком меньше. Интересно, что Visual C++ 2008 догадывается, что там на самом деле (другие компиляторы не настолько догадливы). Однако стандарт С++ говорит о том, что нужно явно указывать компилятору на наличие вызова шаблонной функции там. Об этом говорит пункт 14.2/4. Правильная запись показана ниже:
template<typename TT> void g()
{
A<TT> a;
a.template f<3>(); // correct
}
Слово template выглядит довольно неожиданно в этом месте, что приводит в замешательство не только новичков. Тем более, что Visual C++ игнорирует стандарт по непонятной причине. В будущем стандарте требование ключевого слова остается.

C++'03 Standard 14.2/4:
When the name of a member template specialization appears after . or -> in a postfix-expression, or after nested-name-specifier in a qualified-id, and the postfix-expression or qualified-id explicitly depends on a template-parameter (14.6.2), the member template name must be prefixed by the keyword template. Otherwise the name is assumed to name a non-template.

Комментировать в ВКонтакте