To jest mój (oddzielana) klasy i instancji jednego obiektu:Dlaczego to przeciążenie tego konstruktora jest niepoprawnie rozwiązywane?
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);
Spodziewam się to do wywołania konstruktora Carray(size_type, const T&, const Allocator&)
, ale tak nie jest. Apparantly to postanawia do template<typename InputIterator> Carray(InputIterator, InputIterator, const Allocator&)
.
Co należy zmienić, aby działało zgodnie z przeznaczeniem? Uważam to za dziwne, ponieważ połączenie z std::vector<int> v(5, 10)
działa doskonale. A jeśli spojrzeć na definicję konstruktorów w realizacji mojego GCC Uważam to (I przemianowany kilka nazwisk kompilator-wdrożeniowe, jak __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());
// ...
};
który wydaje się być takie same.
Dziękuję, to pozwala mi w pełni zdefiniować mój nagłówek bez polegania na boostu lub nie-C++ 03. Nie użyję tego oczywiście w kodzie produkcji (gdzie boost :: enable_if jest dużo łatwiejszy w użyciu i odpowiedni). – orlp
@ noccracker, bez obaw ... to było ciekawe wyzwanie ... – Nim