我试图实现向量容器引用 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 。
我该如何解决?
答案 0 :(得分:4)
请注意,标准(自C ++ 11开始)要求重载的here将迭代器作为参数仅在传递的参数充当迭代器时参与重载解析。
如果InputIt满足constructor of
std::vector
,则此重载仅参与重载解析,以避免与重载(2)的歧义。
您可以InputIterator与SFINAE一起使用来完成自己的矢量实现。 e.g。
{
title : "Title",
List : [
{
_id : '123',
content : "Hello"
}
]
}
对于template <typename InputIterator, typename = typename std::iterator_traits<InputIterator>::value_type>
vector (InputIterator first, InputIterator last) { ... }
的情况,InputIterator = int
不包含任何成员类型,如std::iterator_traits<int>
,那么重载将被排除在重载解析之外。
value_type
的确切类型是什么,如果它是size_type
之类的其他类型,如int
,那么std::size_t
第一次重载就会赢得'选择是因为它需要将第一个参数从vector<int> vec(100, 1);
转换为int
,然后将选择第二个重载,因为它可以与std::size_t
生成完美匹配实例化。这不是我们期望的行为。