C 矢量构造函数实例冲突



我正在尝试实现矢量容器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产生完美的匹配实例化。那不是我们期望的行为。

相关内容

  • 没有找到相关文章

最新更新