c++ - C++编译器选择了错误的重载函数

标签 c++ compiler-errors stdlist

我正在尝试实现std::list的学习过程,因为我刚刚开始在学校学习链表和双链表。
这是将代码精简到仅引起问题的部分。
精简以使阅读更好,以便能够分析问题。
对于完整的代码(仍在开发中),这里是链接:
https://www.onlinegdb.com/edit/rJKzbN9ID

#include <iostream>

using namespace std;

template <typename T>
class List
{
    //SFINAE
    template <typename Iter>
    using required_input_iterator = std::enable_if<std::is_base_of_v<std::input_iterator_tag,
          typename std::iterator_traits<Iter>::iterator_category >>;

public:
    using reference =                  T&;
    using const_reference =            const T&;
    using size_type =                  std::size_t;

    class const_iterator ;

    class iterator : public std::input_iterator_tag
    {

    };

    class const_iterator
    {

    };

    List() = default;
    List(std::initializer_list<T> i_list);

    // iterators
    const_iterator end() const noexcept {};
    iterator end() noexcept {};
    const_iterator  cend() const {};

    template<typename InputIterator>//, typename = required_input_iterator<InputIterator>>
    iterator insert(const_iterator pos, InputIterator first, InputIterator last);

};

template <typename T>
List<T>::List(std::initializer_list<T> i_list)
{
    insert(end(), i_list.begin(), i_list.end());
}


template<typename T>
template<typename InputIterator>
typename List<T>::iterator List<T>::insert(const_iterator pos, InputIterator first, InputIterator last)
{
    //
}

int main()
{
   List<int> ll({12, 7, 34, 5});

}
在构造函数中,函数insert()被调用,但是编译会引发以下错误:
error: no matching function for call to 'List<int>::insert(List<int>::iterator, std::initializer_list<int>::const_iterator, std::initializer_list<int>::const_iterator)'
如错误所示,当存在理想的List<int>::iterator版本时,编译器正在选择end()List<int>::const_iterator版本。
如果我注释掉// iterator end() noexcept {};该代码工作正常。
我不知道如何解决此错误。
我认为编译器应该选择正确的函数,但事实并非如此。
为什么会发生这种情况,以及如何解决?
我已经搜索了类似的错误,但是我发现的都与我无关。

最佳答案

如果对象不是const,则选择重载的非const版本。如果不是这种情况,将永远不会选择非const版本。
需要使用iterator来隐式转换为standard中指定的容器中的const_iterator:

X​::​iterator ... any iterator category that meets the forward iterator requirements. convertible to X​::​const_­iterator.


因此,在您的const_iterator中添加一个构造函数通常可以解决您的问题:
class const_iterator {
  const_iterator(const iterator&) { /* implement this */ }
};

关于c++ - C++编译器选择了错误的重载函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64231614/

相关文章:

c++ - 自定义预览面板 - 适用于 Windows 7,不适用于 Vista

c++ - 对 Windows HANDLE 使用 std::unique_ptr

c++ - 具有 NULL 目录名称的 GetDiskFreeSpaceEx 失败

jsp - JSP编译错误怎么可能不是翻译错误?

c++ - 在 C++ 中拆分和合并 std::list

c++ - 没有匹配的函数用于调用 std::list::remove_if( function()::predicate )

c++ - 如何从 OpenCV 中的目录中按顺序读取文件?

android - 程序类型已经存在 : com. google.common.util.concurrent.internal.InternalFutureFailureAccess

f# - 使用 TPL 在 Linux 上编译 F#

c++ - 为什么 GCC 中 std::list O(n) 的 size() 方法?