Что такое typename?
От: KHeLeKRoN Россия  
Дата: 27.07.05 18:26
Оценка:
Читаю Александреску и вижу строку, содержащую слово typename. Это, как я понимаю, ключевое слово. Что оно значит? Контекст такой:
typename ThreadingModel<SmartPtr>::Lock guard(*this);
And solder won't keep me together (c)
Re: Что такое typename?
От: KHeLeKRoN Россия  
Дата: 27.07.05 18:45
Оценка:
Здравствуйте, KHeLeKRoN, Вы писали:

KHL>Читаю Александреску и вижу строку, содержащую слово typename. Это, как я понимаю, ключевое слово. Что оно значит? Контекст такой:
typename ThreadingModel<SmartPtr>::Lock guard(*this);

В смысле, что делает typename в этом контексте? Я с ним знаком только в шаблонах.
And solder won't keep me together (c)
Re: Что такое typename?
От: Анатолий Широков СССР  
Дата: 27.07.05 18:46
Оценка:
Здравствуйте, KHeLeKRoN, Вы писали:

KHL>Читаю Александреску и вижу строку, содержащую слово typename. Это, как я понимаю, ключевое слово. Что оно значит? Контекст такой:
typename ThreadingModel<SmartPtr>::Lock guard(*this);


В данному случае оно указывает компилятору рассматривать Lock как тип, а не как статический член класса ThreadingModel<SmartPtr>.
Re[2]: Что такое typename?
От: KHeLeKRoN Россия  
Дата: 27.07.05 18:54
Оценка:
Здравствуйте, Анатолий Широков, Вы писали:

АШ>Здравствуйте, KHeLeKRoN, Вы писали:


KHL>>Читаю Александреску и вижу строку, содержащую слово typename. Это, как я понимаю, ключевое слово. Что оно значит? Контекст такой:
typename ThreadingModel<SmartPtr>::Lock guard(*this);


АШ>В данному случае оно указывает компилятору рассматривать Lock как тип, а не как статический член класса ThreadingModel<SmartPtr>.

То есть, получается, что guard — переменная типа ThreadingModel<SmartPtr>::Lock, которая инициализирована *this?
And solder won't keep me together (c)
Re[3]: Что такое typename?
От: Анатолий Широков СССР  
Дата: 27.07.05 19:48
Оценка:
KHL>То есть, получается, что guard — переменная типа ThreadingModel<SmartPtr>::Lock, которая инициализирована *this?

Получается
Re[3]: Что такое typename?
От: CrystaX Россия https://crystax.me/
Дата: 27.07.05 19:51
Оценка: 3 (1)
Здравствуйте, KHeLeKRoN, Вы писали:

KHL>То есть, получается, что guard — переменная типа ThreadingModel<SmartPtr>::Lock, которая инициализирована *this?


Да, так и есть. Введено оно для разрешения таких конфликтов:

template <typename T>
struct foo
{
    typedef int type;
};

template <>
struct foo<char>
{
    static int const type = 1;
};

...

foo<int>::type i; // Что здесь type? Переменная или тип? Все зависит от того, 
// есть ли специализация для типа int или нет, а если есть,
// то что в ней означает type. Для разрешения конфликта мы должны 
// явно писать typename перед зависимым именем, если оно является
// типом, и не писать ничего, если имя типом не является.
... << RSDN@Home 1.1.4 stable rev. 510>>
Re[4]: Что такое typename?
От: KHeLeKRoN Россия  
Дата: 28.07.05 04:40
Оценка:
Здравствуйте, CrystaX, Вы писали:

CX>Здравствуйте, KHeLeKRoN, Вы писали:


KHL>>То есть, получается, что guard — переменная типа ThreadingModel<SmartPtr>::Lock, которая инициализирована *this?


CX>Да, так и есть. Введено оно для разрешения таких конфликтов:


CX>
CX>template <typename T>
CX>struct foo
CX>{
CX>    typedef int type;
CX>};

CX>template <>
CX>struct foo<char>
CX>{
CX>    static int const type = 1;
CX>};

CX>...

CX>foo<int>::type i; // Что здесь type? Переменная или тип? Все зависит от того, 
CX>// есть ли специализация для типа int или нет, а если есть,
CX>// то что в ней означает type. Для разрешения конфликта мы должны 
CX>// явно писать typename перед зависимым именем, если оно является
CX>// типом, и не писать ничего, если имя типом не является.
CX>

Пасиба всем за разъяснения
And solder won't keep me together (c)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.