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

Выполняя вариационное программирование на C ++ 11 в GCC, время от времени я получаю сообщение об ошибке "Извините, не реализовано: не могу расширитьИдентификатор...' в список фиксированной длины. " Если я удалю...» в коде я получаю другую ошибку:ошибка: пакеты параметров не расширены с помощью '...».

Так что, если у меня есть "...» в, GCC называет это ошибкой, и если я возьму...» вне, GCC называет это ошибкой тоже.

Единственный способ справиться с этим - полностью переписать метапрограмму шаблона с нуля, используя другой подход, и (если повезет), я в конечном итоге придумаю код, который не 'вызвать ошибку. Но мне бы очень хотелось узнать, что я делаю не так. Несмотря на поиск в Google и несмотря на большие эксперименты, я могуне могу понять, что яЯ делаю по-разному между кодом шаблона variadic, который действительно производит эту ошибку, и кодом, который не имеет ошибки.

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

Вот'Какой-то код, который выдает ошибку. Примечание: я немне нужно, чтобы вы написали правильную реализацию для меня, а просто чтобы указать, что насчет моего кода, который вызывает эту конкретную ошибку

// Used as a container for a set of types.
template  struct TypePack
{
    // Given a TypePack and T=T4, returns TypePack
    template 
    struct Add
    {
        typedef TypePack type;
    };
};

// 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 
struct TypePackFirstN
{
    // sorry, unimplemented: cannot expand ‘Others ...’ into a fixed-length argument list
    typedef typename TypePackFirstN::type type;
};

// The stop condition for TypePackFirstN:  when N is 0, return the TypePack that has been built up.
template 
struct TypePackFirstN //sorry, unimplemented: cannot expand ‘Others ...’ into a fixed-length argument list
{
    typedef TPack type;
};

РЕДАКТИРОВАТЬ: ЯМы заметили, что в то время как частичное создание экземпляра шаблона выглядит так:

template 
struct SomeStruct {};

Переписав это, это не приводит к ошибке:

template 
struct SomeStruct {};

Кажется, что вы можетеобъявлять параметры для частичных специализаций должны быть вариадными; то есть эта строка в порядке:

template 

Но вы не можете на самом делеиспользование эти пакеты параметров в специализации, то есть эта часть не в порядке:

SomeStruct

Тот факт, что вы можете заставить его работать, если вы упаковываете пакет в какой-то другой тип, например, так:

SomeStruct

для меня подразумевает, чтодекларация параметра variadic, чтобы частичная специализация шаблона прошла успешно, и вы можете простоне использовать его напрямую. Кто-нибудь может это подтвердить?

Ответы на вопрос(4)

Ваш ответ на вопрос