Ésta es mi (pelado) clase y creación de instancias de un objeto:¿Por qué esta sobrecarga de constructor se resuelve incorrectamente?
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);
Yo esperaría que esto llama al constructor Carray(size_type, const T&, const Allocator&)
, pero no es así. Aparentemente esto resuelve a template<typename InputIterator> Carray(InputIterator, InputIterator, const Allocator&)
.
¿Qué debo cambiar para que esto funcione según lo previsto? También me parece raro, porque una llamada al std::vector<int> v(5, 10)
funciona perfectamente bien. Y si miro a la definición de los constructores en la ejecución de mi GCC Me parece (Retitulé algunos nombres compilador de ejecución, como __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());
// ...
};
que parece ser la misma.
Gracias, esto me permite definir completamente mi encabezado sin depender de boost o non-C++ 03. No usaré esto en el código de producción, por supuesto (donde boost :: enable_if es mucho más fácil de usar y apropiado). – orlp
@nightcracker, sin preocupaciones ... fue un desafío interesante ... – Nim