2013-04-20 3 views
2

У меня есть шаблон struct, который принимает тип Iterator для аргумента шаблона. Теперь мне нужно специализировать этот класс для итераторов разных контейнеров. Я попытался с станд :: векторчастичная специализация для типа итератора указанного типа контейнера

template<typename Iterator> 
struct AC { 

}; 

template<typename T, typename Alloc> 
struct AC<typename std::vector<T, Alloc>::iterator> { //this doesn't work 

}; 

, но я получил эту ошибку компилятора (VS11): «T»: шаблонный параметр не используется или выводимые в частичной специализации

Может кто-то пожалуйста, скажите мне, почему это не работает? И как заставить его работать?

+0

Почему вы хотите специализироваться на итераторах разных контейнеров? Специализируясь на векторе , итератор, вероятно, не будет использоваться, поскольку это может быть просто T *. Вы пытаетесь увидеть, поддерживает ли в итераторе произвольный доступ, в этом случае вы хотите, чтобы iterator_traits :: iterator_category –

+0

@JohnBandela: Я хочу расходовать категорию итератора, написать свой собственный iterator_traits и сделать его совместимым с stl-контейнерами – Frahm

ответ

2

Вы не можете выводить типы, оставшиеся от гнездования ::. В самом деле, ваш вопрос не имеет смысла. Рассмотрим простой контрпример:

template <typename> struct Foo; 
template <> struct Foo<bool> { typedef float type; }; 
template <> struct Foo<char> { typedef float type; }; 

template <typename> struct DoesntWork; 

template <typename T> struct DoesntWork<typename Foo<T>::type> { }; 

Теперь, если я скажу DoesntWork<float>, что должно T быть?

Дела в том, что нет никаких оснований, что любогоT должен существовать, для которых Foo<T>::type вещи вы хотите, чтобы соответствовать, и даже если бы один, нет никаких причин, почему это было бы уникальным.

+0

Спасибо, это понятно Теперь. – Frahm