C ++向量构造函数实例化冲突

c++ vector constructor instantiation conflicts

我正在尝试实现矢量容器参考 http://www.cplusplus.com/reference/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);时。似乎两个模板构造函数都进行了实例化。所以我得到 template <typename T> vector (size_type n, const T& val)T=inttemplate <typename T> template <typename InputIterator> vector (InputIterator first, InputIterator last)T=int, InputIterator=int.

我该如何解决?

注意,标准(C++11 起)要求以迭代器为参数的重载constructor of std::vector仅在参数作为迭代器传递时参与重载决策。

This overload only participates in overload resolution if InputIt satisfies InputIterator, to avoid ambiguity with the overload (2).

您可以使用SFINAE with std::iterator_traits来完成它以实现您自己的vector。例如

template <typename InputIterator, typename = typename std::iterator_traits<InputIterator>::value_type>
vector (InputIterator first, InputIterator last) { ... }

对于InputIterator = int的情况,std::iterator_traits<int>不包含任何成员类型,如value_type,那么重载将被排除在重载决议之外。


顺便说一句:更准确地说,问题不在于"both template constructor make instantiations";我不确定您的实现中 size_type 的确切类型是什么,如果它是 int 以外的某种类型,例如 std::size_t,那么对于 vector<int> vec(100, 1);,第一个重载将不会' t 被选中,因为它需要将第一个参数从 int 转换为 std::size_t,然后将选择第二个重载,因为它可以产生与 InputIterator = int 的完美匹配实例化。这不是我们期望的行为。