шаблон неоднозначности - PullRequest
12 голосов
/ 02 ноября 2010

Я пытаюсь найти какую-либо информацию о шаблонном ключевом слове, используемом в качестве двусмысленности, но в этом ничего нет. Возможно, я ищу неправильные ключевые слова, но в стандарте нет ничего похожего на .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 Ответ

10 голосов
/ 02 ноября 2010

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

ISO C ++ 03 14.2/4

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

PS:

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

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