Может ли параметр шаблона шаблона вызывать затенение?

Это легальный C++?

template <typename T, template <typename T> class>
struct S { };

Clang (3.7.1) отвергает его, жалуясь, что второй T затмевает первый T. GCC, кажется, не заботится об этом, и я думаю, что это разумно. Я думаю, что в параметре шаблона шаблона имеет значение только количество параметров.


person nodakai    schedule 02.03.2016    source источник
comment
почему вам нужно использовать T дважды? если вы хотите использовать T во втором шаблоне, вы можете написать template <class T, template <class S=T> class>   -  person David Haim    schedule 02.03.2016
comment
@DavidHaim Это не обязательно, но когда первый параметр должен быть передан второму параметру, который является шаблоном шаблона, имеет смысл использовать то же (или, по крайней мере, похожее) имя для параметра вложенного шаблона. Ваше предложение интересно, я никогда не пытался указать параметр по умолчанию для параметра шаблона шаблона. Что это дает по сравнению с template <class T, template <class S> class> ?   -  person nodakai    schedule 02.03.2016
comment
Интересно, что является движущей силой для людей, которые ищут и уничтожают ключевые слова в заголовке поста?? Возможно, они с таким же энтузиазмом заменяют NULL на nullptr?   -  person nodakai    schedule 02.03.2016
comment
Может ли быть связан с этот вопрос?   -  person PaperBirdMaster    schedule 02.03.2016
comment
@DavidHaim Хорошо, с template <template T, template <class S=T> class C> мы можем заменить C<T> на C<>, как если бы C было определено с параметром шаблона по умолчанию... Это может быть удобным в некоторых случаях, но я не уверен, что буду использовать его часто. В любом случае большое спасибо.   -  person nodakai    schedule 02.03.2016
comment
@PaperBirdMaster Спасибо, они обсуждают, когда имя параметра параметра шаблона шаблона имеет значение, и я ошибался, говоря, что имеет значение только количество параметров.   -  person nodakai    schedule 02.03.2016


Ответы (2)


[temp.local]/6:

параметр-шаблона нельзя повторно объявлять в пределах его области действия (включая вложенные области действия).

person T.C.    schedule 02.03.2016
comment
Хм, мне потребовалось некоторое время, чтобы понять, что ваша цитата действительно имеет отношение к моему делу, но верно, речь идет о вложенной области. - person nodakai; 02.03.2016

Хотя правильный ответ существует, мне потребовалось некоторое время, чтобы понять его, и я просто хотел добавить пример:

template <class Key, class T>
class MyData {
public:
    // ...

    template <class Key, class T>
    inline static MyData<Key, T> *get(MyMap<Key, T> *ptr)
    {
        return NULL: // Logic here...
    }

    // ...
}

Как Template-parameters shall not be re-declared within its scope (including nested scopes), указанный выше метод get(..) следует изменить и использовать другие имена, например:

template <class KeyType, class Type>
inline static MyData<KeyType, Type> *get(MyMap<KeyType, Type> *ptr)
{
    return NULL: // Logic here...
}
person Top-Master    schedule 30.01.2021