В C++ требуется ключевое слово typename
, чтобы компилятор мог устранить неоднозначность между вложенными типами и вложенными значениями в шаблонах. Однако существуют определенные ситуации, когда двусмысленность невозможна, например, когда производный класс наследуется от вложенного типа класса.Использование ключевого слова typename с параметрами функции шаблона
template <class T>
class Derived : public T::type
{ };
typename
Здесь ключевое слово не требуется, и это на самом деле даже не допускается. Это имеет смысл, потому что контекст устраняет двусмысленность. Здесь должен ссылаться на тип, поскольку вы, очевидно, не можете наследовать от значения.
Я бы подумал, что то же самое верно для параметров шаблона функции.
template <class T>
void foo(const T::type& v)
{
}
В этом случае из контекста становится ясно, что T::type
должны относиться к типу, так как параметр функции не может быть значением. Тем не менее, компилятор этого не принимает. Он хочет const typename T::type&
. Это кажется непоследовательным. Почему язык допускает неявное предположение о вложенном типе в контексте наследования, но не в контексте параметров функции? В обоих случаях не может быть никакой двусмысленности, поэтому зачем нужна typename
в одном, но не в другом?
Это очень интересный вопрос. – 2010-12-03 16:42:42
Члены комитета C++ являются людьми. Отправьте предлагаемое изменение для следующего стандарта. – 2010-12-03 16:58:15
@ Channel72 во время моего короткого контакта с шаблонами Я понял, что существует еще много непоследовательных и неортогональных правил. Я не могу сказать, что шаблоны были плохо спроектированы, но для улучшения есть определенная комната (комната для гостей не какая-то небольшая комната). – 2010-12-03 17:02:51