Why does this constructor overload resolve incorrectly?

Это мой (разделенный) класс и экземпляр одного объекта:

template <typename T, typename Allocator = std::allocator<T> >
class Carray {
    typedef typename Allocator::size_type size_type;

    // ...

    explicit Carray(size_type n, const T& value, const Allocator& alloc = Allocator()) {
        // ...
    }

    template<typename InputIterator>
    Carray(InputIterator first, InputIterator last, const Allocator& alloc = Allocator()) {
        // ...
    }

    // ...
}

Carray<int> array(5, 10);

Я ожидал, что это вызовет Carray (size_type, const T &, const Allocator & ) , но это не так. Очевидно, это решает шаблон Carray (InputIterator, InputIterator, const Allocator &) .

Что мне нужно изменить, чтобы эта работа работала должным образом? Мне это тоже кажется странным, потому что вызов std :: vector v (5, 10) работает отлично. И если я посмотрю на определение конструкторов в моей реализации GCC, то обнаружу следующее (я переименовал некоторые имена реализации компилятора, например, __ n ):

template<typename T, typename A = std::allocator<T> >
class vector {
    typedef size_t size_type;
    typedef T value_type;
    typedef A allocator_type;

    // ...

    explicit vector(size_type n, const value_type& value = value_type(), const allocator_type& a = allocator_type());

    template<typename InputIterator>
    vector(InputIterator first, InputIterator last, const allocator_type& a = allocator_type());

    // ...
};

, что похоже на то же самое. Thanks

I'm using Visual Studio 2010

88
задан davmos 24 April 2015 в 14:31
поделиться