Đây là của tôi (tước) lớp và instantiation của một đối tượng:Tại sao quá trình xây dựng quá tải này giải quyết không chính xác?
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);
tôi sẽ mong đợi điều này để gọi constructor Carray(size_type, const T&, const Allocator&)
, nhưng nó không. Bảo mật điều này giải quyết thành template<typename InputIterator> Carray(InputIterator, InputIterator, const Allocator&)
.
Tôi nên thay đổi gì để thực hiện công việc này như dự định? Tôi tìm thấy nó cũng lạ, bởi vì một cuộc gọi đến std::vector<int> v(5, 10)
hoạt động hoàn toàn tốt đẹp. Và nếu tôi nhìn vào định nghĩa của các nhà thầu trong việc thực hiện GCC của tôi Tôi tìm thấy điều này (tôi đổi tên một số tên biên dịch-thực hiện, như __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());
// ...
};
mà dường như không thay đổi.
Cảm ơn bạn, điều này cho phép tôi xác định đầy đủ tiêu đề của mình mà không dựa vào việc tăng hoặc không phải C++ 03. Tôi sẽ không sử dụng điều này trong mã sản phẩm của khóa học (nơi boost :: enable_if dễ sử dụng hơn và phù hợp hơn). – orlp
@nightcracker, không phải lo lắng ... đó là một thử thách thú vị ... – Nim