Шаблоны классов могут неявно выводить аргумент шаблона класса, только если он точно соответствует конструктору, например:
template <typename T>
class myVec
{
...
myVec(int, T); // T can be deduced since it's from the class template
...
};
...
myVec(5,5); // deduces myVec<int>
С другой стороны, типы из шаблона конструктора не участвуют в выводе напрямую. - поскольку выведенные типы не обязательно должны быть того же типа, что и шаблон класса:
template <typename T>
class myVec
{
...
template <typename U>
myVec(int, U); // U may not be the same as T!
...
template <typename...Ts>
myVec(Ts&&...); // All 'Ts' types may not be the same as 'T'
...
};
Обойти это можно с помощью пользовательских руководств по выводам . Они позволяют вам определить, какой тип выводится при столкновении с неоднозначными выражениями конструктора. В вашем случае вы, вероятно, ищете что-то вроде:
template <typename...Ts>
myVec(Ts...) -> myVec<std::common_type_t<Ts...>>;
Примечание: std::common_type_t
используется для получения общего типа всех типов variadi c. Он определен в заголовке <type_traits>
.