Рассмотрима этого кода,Использования TYPENAME ключевого слова с ЬурейиМ и нового
template<class T>
struct Sample
{
typename T::X *x; //declare pointer to T's X
};
В приведенной выше коде, ключевое слово typename
требуется компилятор, так что он может неоднозначность между вложенными типами и вложенными значениями в шаблонах. Это означает, что при отсутствии typename
ключевого слова, компилятор будет интерпретировать это как умножение T :: X с й,
T::X *x; //multiply T::X with x
Таким образом, в таких ситуациях, когда может возникнуть неопределенность, ключевое слово typename
становится необходимости так, чтобы устранить неоднозначность. Но есть несколько ситуаций, когда сам контекст устраняет двусмысленности. В other topic обсуждаются контексты базового класса и функциональных параметров (последнее не устраняет неоднозначности). В этой теме, я особенно хочу обсудить два других контексты, которые кажутся однозначна, но мы все еще должны написать typename
,
typedef typename T::X xtype;
pX = new typename T::X;
В этих двух ситуациях, ключевые слова typedef
и new
дают понять достаточно для компилятора, что все, что следует за ним, это тип, незначение.
Так что мой вопрос в том, почему компиляторы все еще нуждаются в ключевом слове typename
, даже в недвусмысленных ситуациях, например, когда мы используем typedef
и new
?
EDIT (после прочтения этого ответа от Johannes Schaub):
//typedef NOT followed by a type!
int typedef A;
Этот синтаксис просит меня изменить мой вопрос немного, так что точка, которую я пытаюсь сделать, может быть видимых другими.
Рассмотрим это,
T::X typedef *x;
Так из контекста, это все еще достаточно ясно компилятору, что T :: X представляет собой тип, независимо от того, появляется ли он перед темtypedef
или послеtypedef
, Если C++ не позволяет писать typedef 5 five
или typedef T::value t_value
(где T :: значение значение), наличие typedef
сами удаляют все двусмысленности и так, typename
, кажется ненужным требование Стандарта (в таких ситуациях). Тот же аргумент справедлив и для new
.
Кроме того, я написал шаблон класса, который использует эту структуру в качестве аргумента шаблона:
struct A
{
struct X { string name; };
static const int X = 100;
};
Я особенно хочу знать, если следующий код (из конструкторы) является правильным (переноснымы) или нет,
//two interesting statements
pX = new typename T::X; //T::X means struct X
product = T::X * p; //but here, T::X means int X
Полный код here на ideone. Пожалуйста, взгляните на него перед ответом. :-)
И вопрос в том, что? –
его вопрос в том, почему компилятору требуется ключевое слово 'typename' после' typedef'. потому что после 'typedef' он всегда знает, что typeString - Commin. Однако я думаю, что так написано синтаксический анализатор. –
@Pawel: вопрос в следующем: зачем компиляторам по-прежнему нужно ключевое слово typename в однозначных ситуациях? – Nawaz