Questo è il mio (spogliata) di classe e istanza di un oggetto:Perché questo overload del costruttore si risolve in modo errato?
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);
mi si aspetterebbe questo per chiamare il costruttore Carray(size_type, const T&, const Allocator&)
, ma non è così. Apparentemente questo si risolve a template<typename InputIterator> Carray(InputIterator, InputIterator, const Allocator&)
.
Cosa devo cambiare per fare in modo che funzioni come previsto? Lo trovo strano anche perché una chiamata a std::vector<int> v(5, 10)
funziona perfettamente bene. E se guardo la definizione dei costruttori nella realizzazione del mio GCC ho trovato questo (ho rinominato alcuni nomi compilatore-implementazione, come __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());
// ...
};
che sembra essere lo stesso.
Grazie, questo mi consente di definire completamente la mia intestazione senza fare affidamento su boost o non C++ 03. Non lo userò ovviamente nel codice di produzione (dove boost :: enable_if è molto più facile da usare e appropriato). – orlp
@nightcracker, nessuna preoccupazione ... è stata una sfida interessante ... – Nim