Подтвердить что ты не робот

Шаблонный неоднозначный

Я пытаюсь найти любую информацию о ключевом слове, используемом как disambiguator, но в этом нет ничего. Вероятно, я ищу неправильные ключевые слова, но нет ничего подобного шаблону .template или → в стандарте. Google показывает только проблемы GCC с разных форумов, но на самом деле не объясняет, для чего он используется.

Подобный код не удалось скомпилировать без ключевого слова шаблона в строке 11 (в GCC), но я не совсем уверен, что это соответствует стандарту.

template<typename B>
struct S1
{
    template<typename T> void test() {}
};

template<typename T>
struct S2
{
    S2()
    {
        S1<T>().template test<int>();
    }
};

int main()
{
   S2<int>();
}

Итак, мой вопрос: зачем используется ключевое слово template, какая двусмысленность существует без этого ключевого слова и где я могу прочитать об этом (я бы очень признателен за ссылку на стандарт).

Спасибо.

4b9b3361

Ответ 1

Короткий ответ: поскольку стандарт говорит так

ISO С++ 03 14.2/4

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

P.S:

Без этого дополнительного использования шаблона компилятор не знает, что нижеуказанный (<) ток не действительно "меньше", а начало списка аргументов шаблона.