На этом сайте есть много вопросов с проблемами при компиляции кода шаблона С++. Одним из наиболее распространенных решений таких проблем является добавление ключевого слова 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
.
Если нет, нужны ли эти ключевые слова в таких значениях?
Небольшой обзор текущей ситуации
@Paul Evans написал хороший ответ, но он более подходит для вопроса "Где и почему мне нужно поставить ключевые слова" template "и" typename "?" , а не на мой вопрос.
@Simple привел пример требуемого кода для typename
ключевое слово и его возможные варианты. @Jarod42 дал другую вариацию без каких-либо шаблонов, Вероятно, это ошибка gcc, потому что не компилируется с clang.
@nm привел пример требуемого кода для template
ключевое слово, @dyp улучшено. @nm также написал другой код для обоих ключевых слов используя SFINAE.
@James Kanze в своем ответе утверждает, что невозможно записать требуемый код, и любые попытки сделать это приведут к undefined. Таким образом, приведенные выше примеры кода являются незаконными.
Интересно узнать, кто прав и что говорит об этом в стандарте С++.