Формат специализации шаблона функции

Другой вариант, предложенный здесь здесь , устанавливает стиль изображения как style="display: block;"

30
задан Community 23 May 2017 в 11:45
поделиться

1 ответ

Я просмотрел его и обнаружил, что он указан в 14.5.2 / 2:

Локальный класс не должен иметь шаблонов членов. Правила контроля доступа (раздел 11) применяются к именам шаблонов элементов. Деструктор не должен быть шаблоном члена. Обычная (не шаблонная) функция-член с заданным именем и типом и шаблон функции-члена с тем же именем, которые можно использовать для создания специализации одного и того же типа, могут быть объявлены в классе. Когда оба существуют, использование этого имени и типа относится к элементу, не являющемуся шаблоном, если не указан явный список аргументов шаблона.

И это дает пример:

template <class T> struct A {
    void f(int);
    template <class T2> void f(T2);
};

template <> void A<int>::f(int) { } // non-template member
template <> template <> void A<int>::f<>(int) { } // template member

int main()
{
    A<char> ac;
    ac.f(1); //non-template
    ac.f(’c’); //template
    ac.f<>(1); //template
}

Обратите внимание, что в Стандартных терминах, специализация относится к функции, которую вы пишете с использованием явной специализации, и к функции, созданной с помощью создания экземпляра, в этом случае мы имеем дело с сгенерированной специализацией. специализация относится не только к функциям, которые вы создаете, используя явную специализацию шаблона, для которых он часто только используется.

Заключение: GCC ошибается. Comeau, с которым я также тестировал код, понимает его правильно и выдает диагностику:

«ComeauTest.c» , строка 16: ошибка: «void doh :: operator () (bool)» не является организацией, can be explicitly specialized template<> void doh::operator()(bool i)

Note that it isn't complaining about the specialization of the template for int (only for bool), since it doesn't refer to the same name and type: The function type that specialization would have is void(int), which is distinct from the function type of the non-template member function, which is void(bool).

31
ответ дан 28 November 2019 в 00:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: