Другой вариант, предложенный здесь здесь , устанавливает стиль изображения как style="display: block;"
Я просмотрел его и обнаружил, что он указан в 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 specializedtemplate<> 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)
.