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

时间:2017-05-06 14:35:04

标签: c++ templates vector overload-resolution

我试图实现向量容器引用 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

我该如何解决?

1 个答案:

答案 0 :(得分:4)

请注意,标准(自C ++ 11开始)要求重载的here将迭代器作为参数仅在传递的参数充当迭代器时参与重载解析。

  

如果InputIt满足constructor of std::vector,则此重载仅参与重载解析,以避免与重载(2)的歧义。

您可以InputIteratorSFINAE一起使用来完成自己的矢量实现。 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>,那么重载将被排除在重载解析之外。

BTW:更确切地说,问题不在于“模板构造函数都是实例化”;我不确定您的实现中value_type的确切类型是什么,如果它是size_type之类的其他类型,如int,那么std::size_t第一次重载就会赢得'选择是因为它需要将第一个参数从vector<int> vec(100, 1);转换为int,然后将选择第二个重载,因为它可以与std::size_t生成完美匹配实例化。这不是我们期望的行为。