我正在尝试实现矢量容器http://www.cplusplus.com/reference/vector/Vector/Vector/Vector/。有两个构造函数引起了一些问题:
template <typename T>
vector (size_type n, const T& val);
template <typename T>
template <typename InputIterator>
vector (InputIterator first, InputIterator last);
当我使用vector<int> vec(100, 1);
时。似乎两个模板构造函数都可以实例化。因此,我获得了 t = int 和template <typename T> template <typename InputIterator> vector (InputIterator first, InputIterator last)
的template <typename T> vector (size_type n, const T& val)
, t = int,inputiterator = int 。
我该如何解决?
请注意,标准(自C 11(要求std::vector
的过载构造函数将迭代器作为参数作为参数仅参与过超载分辨率,而当参数传递为迭代器时。
如果输入器满足inputiterator,则仅参与过载分辨率,以避免使用过载(2(。
。
您可以将SFINAE与STD :: Iterator_traits一起使用,以实现自己的实现。例如
template <typename InputIterator, typename = typename std::iterator_traits<InputIterator>::value_type>
vector (InputIterator first, InputIterator last) { ... }
对于InputIterator = int
的情况,std::iterator_traits<int>
不包含任何成员类型,例如value_type
,然后将过载排除在过载分辨率中。
btw:更确切地说,问题不是"两个模板构造函数制造实例化";我不确定您的实现中size_type
的确切类型是什么,如果是某种类型的其他类型的int
(例如std::size_t
(,那么对于vector<int> vec(100, 1);
,将不会选择第一个过载,因为它需要从int
转换为std::size_t
,然后将选择第二个超载,因为它可以与InputIterator = int
产生完美的匹配实例化。那不是我们期望的行为。