gpt4 book ai didi

c++ - 如何区分这两个插入函数

转载 作者:行者123 更新时间:2023-12-04 07:25:43 24 4
gpt4 key购买 nike

我自己的列表有两个插入功能

template<typename T, typename Allocator>
auto list<T, Allocator>::insert(iterator pos, size_t count, const T & value)->iterator
{
for (size_t i = 0; i < count; i++) {
pos = insert(pos, value);
}
return pos;
}


template<typename T, typename Allocator>
template<typename ...Args>
auto list<T, Allocator>::insert(iterator pos, Args && ...args) -> iterator
{
auto ret_val = this->get_allocator().allocate(1);
this->get_allocator().construct(ret_val, std::forward<Args>(args)...);
auto new_node = new node<T>(ret_val);
auto current_node = pos.l_node;
new_node->n_next = current_node;
new_node->n_prev = current_node->n_prev;
current_node->n_prev->n_next = new_node;
current_node->n_prev = new_node;
return iterator(new_node);
}

有时编译器不知道应该调用哪个函数,例如下面的情况
list<int> l1;
l1.insert(l1.begin(),10, 2);
我期望调用的是第一个函数,但实际上调用的是第二个函数,然后会出现如下错误 The compiler cannot cast from initializer_list to int.代码在这里: https://paste.ubuntu.com/p/FxHPrdDHsj/

最佳答案

第二个被调用是因为它是一个更好的匹配。
第一个函数需要三个参数 (iterator, size_t, int) .
第二个函数需要 N 个参数 (iterator, stuff) .
您提供的是 (iterator, int, int) .
匹配第一个函数需要隐式转换( int -> size_t )。匹配第二个不需要转换。
将调用更改为 l1.insert(l1.begin(),(size_t) 10, 2)它应该调用第一个。

关于c++ - 如何区分这两个插入函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68228239/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com