Здесь есть две путаницы.
<ч />
Во-первых, руководства по удержанию должны находиться в области действия шаблона класса, которым они руководствуются, поэтому это руководство никогда не будет рассматриваться:
template <class Iter>
std::set(Iter, Iter) -> std::set<typename std::iterator_traits<Iter>::value_type>;
Это должно выглядеть так:
namespace std {
template <class Iter>
set(Iter, Iter) -> set<typename iterator_traits<Iter>::value_type>;
}
Но вы не можете добавлять вещи в namespace std
, так что не делайте этого. И кроме того, это руководство по выводу уже существует для set
:
template<class InputIt,
class Comp = std::less<typename std::iterator_traits<InputIt>::value_type>,
class Alloc = std::allocator<typename std::iterator_traits<InputIt>::value_type>>
set(InputIt, InputIt, Comp = Comp(), Alloc = Alloc())
-> set<typename std::iterator_traits<InputIt>::value_type, Comp, Alloc>;
Так что нет никакой причины добавлять вашу версию.
<ч />
Причина , по которой руководство по выводам не используется, и не будет, если вы поместите его в правильное пространство имен, является обычным главным предупреждением для инициализации списка:
Если есть соответствующий initializer_list<T>
конструктор, настоятельно рекомендуется , чем что-либо еще.
Конкретное правило языка состоит в том, что мы сначала делаем разрешение перегрузки специально для этих конструкторов, а затем делаем остальное. И одно из других руководств по выводам в нашем списке:
template<class Key, class Comp = std::less<Key>, class Alloc = std::allocator<Key>>
set(std::initializer_list<Key>, Comp = Comp(), Alloc = Alloc())
-> set<Key, Comp, Alloc>;
Обратите внимание:
std::set s{a.begin(), a.end()};
точно такой же вид конструкции как:
std::set u{1, 2};
То, что два наших элемента одного типа являются итераторами, не означает, что с ними обращаются иначе, чем с двумя другими элементами одного типа. Итак, мы получаем набор итераторов.
Если вы хотите использовать другое руководство по выводам с другим конструктором, вы должны использовать скобки:
std::set s(a.begin(), a.end());
И удалите руководство по удержанию!