Ваша проблема в том, что вы хотите предоставить специализацию шаблона, которая является самим шаблоном.
Самый простой способ решения вашей проблемы - вообще не использовать специализацию шаблона и вместо этого полагаться на перегрузку функций.
template<class T> void serialize(T *value, Serializer *serializer);
может по-прежнему предоставлять реализацию по умолчанию, но если существует более специализированная версия, такая как
void serialize(bool *value, Serializer *serializer);
, ее предпочтение будет отдаваться разрешением перегрузки.Это позволяет вам просто определить функцию типа
template <typename T> void serialize(::std::vector<T> *value, Serializer *serializer);
, которая будет вызываться для векторов.(Учтите, что :: std :: vector более специализирован, чем T, поэтому разрешение перегрузки выберет эту функцию там, где это возможно).