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=int 和 template <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
的完美匹配实例化。这不是我们期望的行为。
我正在尝试实现矢量容器参考 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=int 和 template <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
的完美匹配实例化。这不是我们期望的行为。