“недопустимое использование неполного типа” ошибка с частичной шаблонной специализацией

Не думаю, что я достаточно поняла, чего вы пытаетесь достичь, но ...

Если вы уверены, что sizeof(test1uni) == sizeof(test2uni) == sizeof(int) и в структуре нет ничего другого, тогда вы можете трактовать сам finalstruct как массив int с:

int *ptr = (int*)&finstr;
for(int i=0; i<sizeof(finstr)/sizeof(int); i++)
    printf("val: %i addr: %x\n", ptr[i], &ptr[i]);

, но как он был поднят в комментарии, приведение структуры к типу int, вероятно, нарушает строгое псевдонимы, и «наказание типов» с использованием членов union больше не разрешено явно в C ++ (в отличие от явно не разрешенного). Таким образом, это относится к области неопределенного поведения, поэтому вам необходимо:

  1. Отключить оптимизацию на основе строгого алиасинга. Например. передать -fno-strict-aliasing в GCC 3.4.1 и выше. Тем не менее, все еще есть проблема с типом наказания.
  2. Проверьте сборку, чтобы убедиться, что компилятор делает то, что вам нужно.
  3. Изменить на C.

Также помните о других ошибках: int должно быть кратным слову, finstr должно быть выровнено по границе слова, компилятор / платформа должна следовать соглашению. Поэтому я бы не стал рассматривать этот портативный компьютер без более строгой строгости.

31
задан Jesse Beder 2 October 2008 в 23:47
поделиться

1 ответ

Вы не можете частично специализировать функцию. Если Вы хотите сделать так на функции членства, необходимо частично специализировать весь шаблон (да, это является раздражающим). На большом шаблонном классе, для неравнодушной специализации функции Вам было бы нужно обходное решение. Возможно, шаблонная членская структура (например, template <typename U = T> struct Nested) работала бы. Или иначе можно попытаться произойти из другого шаблона, который частично специализируется (работы, если Вы будете использовать this->member нотация, то иначе Вы встретитесь с ошибками компилятора).

38
ответ дан 27 November 2019 в 22:26
поделиться
Другие вопросы по тегам:

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