Ключевые слова «typename» и «template»: действительно ли они необходимы?

На этом сайте много вопросов, связанных с проблемами при компиляции кода шаблона c ++. Одним из наиболее распространенных решений таких проблем является добавлениеtypename (и, реже,template) ключевое слово в нужных местах кода программы:

template<typename T>
class Base
{
public:

    typedef char SomeType;

    template<typename U>
    void SomeMethod(SomeType& v)
    {
        // ...
    }

};

template<typename T>
class Derived : public Base<T>
{
public:

    void Method()
    {
        typename Base<T>::SomeType x;
    //  ^^^^^^^^

        this->template SomeMethod<int>(x);
    //        ^^^^^^^^
    }
};

Существует ли код, который компилируется как с ключевым словом, так и без негоtypename и дает разные результаты (например, выходные строки)? Подобный вопрос дляtemplate ключевое слово.

Если нет, действительно ли эти ключевые слова необходимы в таких значениях?

Небольшой обзор текущей ситуации

@ Пол Эванс написал хороший ответ, но он больше подходит для вопроса"Где и почему я должен поставить ключевые слова" template "и" typename "?"не на мой вопрос.

@Просто дал примернеобходимый код дляtypename ключевое слово а такжеего возможное изменение. @ Jarod42 далдругой вариант без каких-либо шаблоновчто, вероятно,НКУ ошибка, потому что этоне компилируется слязг.

@ N.m. дал примернеобходимый код дляtemplate ключевое слово, @dyp улучшил это. @ N.m. также написалдругой код для обоих ключевых слов с помощьюSFINAE.

@James Kanze В своем ответе утверждает, что невозможно написать необходимый код и любые попытки сделать это приведут к неопределенному поведению. Таким образом, приведенные выше примеры кода являются незаконными.

Интересно узнать, кто прав и что говорит об этом стандарт C ++.

Ответы на вопрос(2)

Ваш ответ на вопрос