Ошибка GCC с шаблонами переменных: «Извините, не реализовано: невозможно развернуть« Идентификатор ... »в список аргументов фиксированной длины»

Как следует из названия, здесь используется буфер памяти, используемый для управления выходом вывода скрипта.

Вот один очень хороший учебник для темы

37
задан R. Martinho Fernandes 22 March 2012 в 20:40
поделиться

3 ответа

Есть трюк, чтобы получить это работать с GCC. Функция еще не полностью реализована, но вы можете структурировать код, чтобы избежать нецелементных разделов. Вручную расширяя вариадический шаблон в список параметров не будет работать. Но специализация шаблона может сделать это для вас.

template< char head, char ... rest >
struct head_broken
{
   static const char value = head;
};

template< char ... all >
struct head_works; // make the compiler hapy

template< char head, char ... rest >
struct head_works<head,rest...> // specialization
{
   static const char value = head;
};

template<char ... all >
struct do_head
{
   static const char head = head_works<all...>::value;
   //Sorry, unimplemented: cannot expand 'all...' into a fixed-length arugment list
   //static const char head = head_broken<all...>::value;
};

int main
{
   std::cout << head_works<'a','b','c','d'>::value << std::endl;
   std::cout << head_broken<'a','b','c','d'>::value << std::endl;
   std::cout << do_head<'a','b','c','d'>::head << std::endl;
}

Я проверил это с GCC 4.4.1

48
ответ дан 27 November 2019 в 04:51
поделиться

Какую версию GCC вы используете? В соответствии с этой страницей состояния GCC, GCC 4.4 должен его поддерживать.

Тестирование с помощью GCC 4.4.2, я получаю аналогичную ошибку.

Формулировка сообщения об ошибке выглядит так. означающий, что код должен работать в соответствии со стандартом C++0x, но это... GCC еще не поддерживает это. Или, возможно. это ошибка компилятора?

Это правильно, GCC понимает код, но пока не может выплюнуть за него GIMPLE.

Что касается причины ошибки, это расширение списка шаблонных переменных до списка переменных другого шаблона.

.
2
ответ дан 27 November 2019 в 04:51
поделиться

Насколько я понимаю, об ошибке сообщается, потому что компилятор видит объявление класса шаблона как класс с как минимум 3 аргументами, за которыми следуют необязательные . Поскольку вы пытаетесь обратиться к нему с двумя аргументами, за которыми следует список раскрытия, он сбивается с толку и выдает эту ошибку. Для правильной компиляции вам просто нужно сначала объявить шаблон следующим образом:

template <int N, typename TPack, typename... Others>
struct TypePackFirstN;

И после этого определение шага рекурсии должно быть переформулировано как специализация шаблона. (это помогает с gcc 4.5.0 20100404).

// Takes the set (First, Others...) and, while N > 0, adds (First) to TPack.
// TPack is a TypePack containing between 0 and N-1 types.
template <int N, typename TPack, typename First, typename... Others>
struct TypePackFirstN<N, TPack, First, Others...>
{
    // Error "sorry, unimplemented: cannot expand ‘Others ...’ into a fixed-length argument list" should be now gone
    typedef typename TypePackFirstN<N-1, typename TPack::template Add<First>::type, Others...>::type type;
};

// The stop condition for TypePackFirstN:  when N is 0, return the TypePack that has been built up.
template <typename TPack, typename... Others>
struct TypePackFirstN<0, TPack, Others...>         // Error "sorry, unimplemented: cannot expand ‘Others ...’ into a fixed-length argument list" should be now gone
{
    typedef TPack type;
};
3
ответ дан 27 November 2019 в 04:51
поделиться
Другие вопросы по тегам:

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