Нет, это не работает. Но на самом деле вам не нужен шаблон
double dot(const Vector &, const Vector &) {...}
работает. Вам даже не нужен оператор преобразования, определенный в UnitVector
. Дочерние в базовые преобразования выполняются неявно.
Если вы хотите в общем случае взять два типа, которые неявно преобразуются в общий тип, следующее должно работать (не проверено)
template<class U>
double dot_impl(const U&, const U&) {...}
template<class U, class V>
auto dot(const U &u, const V &v) {
return dot_impl<std::common_type_t<U, V>>(u, v);
}
Поскольку шаблон Параметр является явным, неявные преобразования в общий тип этих двух выполняются в вызове, поэтому все работает хорошо. Я переместил оригинал dot
в dot_impl
, так как в противном случае мы будем вызывать dot
с одним параметром шаблона, который все еще может быть неоднозначным.