шаблон специализации функций
Первый заказ бизнеса. Это не специализация. Важно получить это из пути, чтобы найти решение. Это перегрузка. Два шаблона функций перегружают имя make
. И разрешение перегрузки определяет, что лучше подходит после синтеза их сигнатур. В вашем случае две сигнатуры, которые может вывести компилятор:
int make(MyVector);
int make(std::vector<int> const&);
Одна - это преобразование идентификатора, в то время как другая требует привязки ссылки к базе, которая по степени конверсии хуже, чем "идентичность". ,Таким образом, выбирается первая перегрузка.
Перед вами есть несколько вариантов:
Предпочитайте псевдоним типа, например using MyVector = std::vector<int>;
. Она прямолинейна, точно соответствует второй перегрузке и выберет ее из-за частичного упорядочения шаблонов функций.
Добавьте перегрузку MyVector
, которая делегирует:
int make(MyVector const& v) { return make(static_cast<MyVector::vector const&>(v)); }
Используйте более сложную технику для управления разрешением перегрузки. Стандартная библиотека имеет несколько утилит для управления процессом на основе SFINAE . Для этого потребуется изменить первую перегрузку следующим образом:
template <typename T>
std::enable_if_t<!std::is_convertible_v<T*, std::vector<int>*>, int>
make(T value) {
return 1;
}
Но этот подход слишком удобен для экспертов и быстро не масштабируется при многих перегрузках шаблона. Сначала я рекомендую два предыдущих подхода.