Как написано, я считаю, что у вас есть ошибка.Вы не специализирующийся оператор ==, вы его перегружаете.Вы не можете перегружать параметр шаблона таким образом.
Если бы ваш метод был бесплатной функцией, вы могли бы специализировать его.Например,
template <typename T>
void Foo(Vector<T> x) {
std::cout << "x" << std::endl;
}
template <>
void Foo(Vector<float> y) {
std::cout << "y" << std::endl;
}
...
Vector<int> intVec;
Vector<float> floatVec;
Foo(intVec); //prints x
Foo(floatVec); //prints y
В этом случае, если вы вызовете Foo с помощью Vector<float>
, вы вызовете специализированную версию.
Порядок имеет значение в некоторой степени.Прежде всего, компилятор всегда будет отдавать предпочтение специализации, а не специализированной форме, когда она доступна.После этого компилятор попытается создать экземпляр каждой функции по порядку.Если он сможет успешно скомпилировать, будет использована эта специализация.Если это невозможно, он перейдет к следующему.Этот принцип, называемый Сбой замещения, не является ошибкой (SFINAE).http://en.wikipedia.org/wiki/Substitution_failure_is_not_an_error имеет гораздо более подробное описание.