Ключевые слова «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 ++.