2013-06-26 2 views
2

Использование GCC 4.7.3, я получаю следующее сообщение об ошибкеПочему это определение специализации по вариационному шаблону не компилируется?

prog.cpp: In function ‘int main()’: prog.cpp:27:63: error: ‘Erase >::Result’ has not been declared

с this code:

template <typename... List> 
struct TypeList 
{ 
    enum 
    { 
     Length = sizeof...(List) 
    }; 
}; 

template <typename ToErase, typename... List> 
struct Erase; 

template <typename ToErase> 
struct Erase<ToErase, TypeList<>> 
{ 
    typedef TypeList<> Result; 
}; 

template <typename ToErase, typename... Head, typename... Tail> 
struct Erase<ToErase, TypeList<Head..., ToErase, Tail...>> 
{ 
    typedef TypeList<Head..., Tail...> Result; 
}; 

int main() 
{ 
    static_assert(Erase<double, TypeList<int, double, char>>::Result::Length == 2, 
    "Did not erase double from TypeList<int, double, char>"); 

    return 0; 
} 

Я не понимаю, почему этот код не компилируется дано сообщение об ошибке я получил , учитывая, что подобный случай компилируется чисто:

template <typename ToAppend, typename... List> 
struct Append; 

template <typename ToAppend, typename... List> 
struct Append<ToAppend, TypeList<List...>> 
{ 
    typedef TypeList<List..., ToAppend> Result; 
} 

template <typename... ToAppend, typename... List> 
struct Append<TypeList<ToAppend...>, TypeList<List...>> 
{ 
    typedef TypeList<List..., ToAppend...> Result; 
} 

есть цитата из стандарта о не в состоянии вывести элементы в середине ТВт o пакетов параметров, как я пытаюсь сделать с первым блоком кода?

ответ

3

§ 14.8.2.5 (Дедукция аргументов шаблона от типа), пункт 5 перечисляет контексты, в которых аргументы шаблона не могут быть выведены. Соответствующий один является последним в списке:

— A function parameter pack that does not occur at the end of the parameter-declaration-clause.

Так:

struct Erase<ToErase, TypeList<Head..., ToErase, Tail...>> 

Head не может быть выведено; он не встречается в конце списка параметров.

В противоположность этому, в:

struct Append<TypeList<ToAppend...>, TypeList<List...>> 

Оба ToAppend и List появляются в конце их соответствующих списков параметров, и, следовательно, они могут быть выведены.

 Смежные вопросы

  • Нет связанных вопросов^_^