Здравствуйте, 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>>
Читаю Александреску и вижу строку, содержащую слово typename. Это, как я понимаю, ключевое слово. Что оно значит? Контекст такой:
typename ThreadingModel<SmartPtr>::Lock guard(*this);
Здравствуйте, KHeLeKRoN, Вы писали:
KHL>Читаю Александреску и вижу строку, содержащую слово typename. Это, как я понимаю, ключевое слово. Что оно значит? Контекст такой:typename ThreadingModel<SmartPtr>::Lock guard(*this);
В смысле, что делает typename в
этом контексте? Я с ним знаком только в шаблонах.
Здравствуйте, KHeLeKRoN, Вы писали:
KHL>Читаю Александреску и вижу строку, содержащую слово typename. Это, как я понимаю, ключевое слово. Что оно значит? Контекст такой:typename ThreadingModel<SmartPtr>::Lock guard(*this);
В данному случае оно указывает компилятору рассматривать Lock как тип, а не как статический член класса ThreadingModel<SmartPtr>.
Здравствуйте, Анатолий Широков, Вы писали:
АШ>Здравствуйте, KHeLeKRoN, Вы писали:
KHL>>Читаю Александреску и вижу строку, содержащую слово typename. Это, как я понимаю, ключевое слово. Что оно значит? Контекст такой:typename ThreadingModel<SmartPtr>::Lock guard(*this);
АШ>В данному случае оно указывает компилятору рассматривать Lock как тип, а не как статический член класса ThreadingModel<SmartPtr>.
То есть, получается, что guard — переменная типа ThreadingModel<SmartPtr>::Lock, которая инициализирована *this?
Здравствуйте, 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>
Пасиба всем за разъяснения