У меня есть структура шаблона, которая принимает тип итератора для аргумента шаблона.
теперь мне нужно специализировать этот класс для итераторов разных контейнеров.
Я пробовал с std :: vector
template<typename Iterator>
struct AC {
};
template<typename T, typename Alloc>
struct AC<typename std::vector<T, Alloc>::iterator> { //this doesn't work
};
но я получил эту ошибку компилятора (VS11):
‘T’: параметр шаблона не используется или не выводится при частичной специализации
Может кто-нибудь сказать мне, почему это не работает? И как заставить это работать?
Вы не можете вывести типы, оставшиеся от вложенности ::
, Действительно, ваш вопрос не имеет смысла. Рассмотрим этот более простой контрпример:
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
это вещь, которую вы хотите сопоставить, и даже если бы она была, нет причины, почему она была бы уникальной.
Других решений пока нет …