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