Bu, bir nesnenin benim (soyulmuş) sınıf ve örnekleme geçerli:Bu kurucu neden yanlış bir şekilde aşırı yükleniyor?
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);
Bu Carray(size_type, const T&, const Allocator&)
kurucusunu çağırmak için beklenebilir ancak öyle değil. Anlaşılan bu, template<typename InputIterator> Carray(InputIterator, InputIterator, const Allocator&)
için karar verir.
Bu çalışmayı amaçlandığı şekilde yapmak için ne değiştirmeliyim? Bunu da garip buluyorum çünkü std::vector<int> v(5, 10)
numaralı telefona yapılan çağrı mükemmel bir şekilde çalışıyor. Ben GCC en uygulanmasında inşaatçı tanımına bakacak olursak (Ben __n
gibi bazı derleyici-uygulama adları değiştirildi) bu bulmak: görünüyor
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());
// ...
};
aynı olması.
Teşekkür ederim, bu sayede ya başlığımı ya da C++ 03'e dayanmadan başlığımı tam olarak tanımlamamı sağlıyor. Bunu üretim kodunda kullanmam (elbette boost :: enable_if'in kullanılması ve uygun olması daha kolay). – orlp
@nightcracker, endişelenme ... ilginç bir sorun oldu ... – Nim