В классе шаблонов С++ могу ли я ввести параметр шаблона с тем же именем?

Если у меня есть класс шаблона:

template<typename Layout>
class LayoutHandler : Handler {
};

и я хочу разоблачить параметр Layout для пользователя класса. Тогда:

template<typename Layout>
class LayoutHandler : Handler {
public:
    typedef Layout Layout; // using the same name
};

VS2012 может скомпилировать этот код и дать ожидаемый результат. (Я использую std:: is_same, чтобы проверить его.) Разрешено ли это в стандартном С++ 03 или С++ 11?

Ответ 1

Это запрещено в С++ 11.

A typedef - это объявление. (см. раздел 7.1.3)

Параметр

A template не может быть обновлен в пределах его области (включая вложенные области). (см. раздел 14.6.1.6)

С++ 11 черновик стандарта n3242

Ответ 2

Нет до C + 11, вы не можете его использовать, это дает вам ошибку.

Объявление 'typedef Layout LayoutHandler:: Макет error: shadows template parm 'class Layout