Шаблон неоднозначности
Я пытаюсь найти какую-либо информацию о ключевом слове шаблона, используемом в качестве неоднозначного слова, но в этом ничего нет. Возможно, я ищу неправильные ключевые слова, но в стандарте нет ничего похожего на.template или ->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>();
}
Итак, мой вопрос: почему здесь используется ключевое слово шаблона, что за двусмысленность без этого ключевого слова и где я могу прочитать об этом (я был бы очень признателен за ссылку на стандарт).
Благодарю.
1 ответ
Краткий ответ: потому что стандарт так говорит
ISO C++03 14.2/4
Когда имя члена шаблона специализации появляется после. или -> в выражении postfix или после спецификатора nested-name в квалифицированном идентификаторе, а выражение postfix или квалифицированный идентификатор явно зависит от параметра-шаблона (14.6.2), имя шаблона элемента должно быть с префиксом шаблона ключевого слова. В противном случае предполагается, что имя не является шаблоном.
PS:
Без этого дополнительного использования шаблона компилятор не знает, что токен меньше (<)
то, что следует, - это на самом деле не "меньше чем", а начало списка аргументов шаблона.