или же

отрим этот код,

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 становитсянеобходимость чтобы убрать неясности. Но есть несколько ситуаций, когда сам контекст устраняет неясности.другая тема обсуждает контексты базового класса и функциональных параметров (хотя последний не устраняет двусмысленность). В этой теме я особенно хочу обсудить два других контекста,недвусмысленный, но мы все еще должны написатьtypename,

typedef typename T::X xtype;
pX = new typename T::X;  

В этих двух ситуациях ключевые словаtypedef а такжеnew дать понять компилятору, что все, что следуеттип, не значение.

Итак, мой вопрос, почему компиляторы все еще нуждаются вtypename ключевое слово, даже в однозначных ситуациях, например, когда мы используемtypedef а такжеnew?

РЕДАКТИРОВАТЬ (после прочтения этого ответа отЙоханнес Шауб):
//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

Полный кодВот в идеале. Пожалуйста, посмотрите на это, прежде чем ответить. :-)

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

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