Ошибка 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, чтобы частичная специализация шаблона прошла успешно, и вы можете простоне использовать его напрямую. Кто-нибудь может это подтвердить?