我正在尝试实现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/