gpt4 book ai didi

c++ - 调用了错误的模板函数

转载 作者:行者123 更新时间:2023-11-30 01:40:56 25 4
gpt4 key购买 nike

我在类似 STL 的列表容器中定义了以下两个函数:

// copy the specified VALUE some COUNT number of times and insert copies
// right before POS.
Iterator insert(Iterator pos, size_type count, const value_type
&value);

// copy the values from [FIRST, LAST) from the specified Iterators and
// place before POS.
template<class InputIt>
Iterator insert(Iterator pos, InputIt first, InputIt last);

然后我尝试用一​​些任意代码测试我的函数实现:

std::list<int> stlList = { 1, 2, 3, 4, 5 };
MyList<int> intList;

intList.insert(intList.begin(), 5, 0); // expected call to first insert
intList.insert(intList.begin(), stlList.begin(), stlList.end()); // expected call to second insert

但是,对于他们两个来说,似乎正在调用第二个函数。我有点看到歧义,因为两个函数都有三个参数,我看到编译器如何调用错误的函数。但我不确定我错过了什么。我的函数一直基于 STL,据我所知,它们的定义方式几乎相同 ( STL's List Insert )。

最佳答案

intList.insert(intList.begin(), 5, 0); 选择

的原因
template<class InputIt>
Iterator insert(Iterator pos, InputIt first, InputIt last);

结束

Iterator insert(Iterator pos, size_type count, const value_type &value);

是因为模板函数产生了精确匹配。

50 具有相同的类型,因此 InputIt 被推断为 int 这使得函数看起来像

Iterator insert(Iterator pos, int first, int last);

你的其他重载的样子

Iterator insert(Iterator pos, size_t first, int last);

如您所见,调用模板推导版本不需要转换,因此它优于非模板重载。

您必须将 5 转换为 size_t 才能调用非模板重载或使用 SFINAE 仅在 InputIt< 时调用模板重载 实际上是一个迭代器。

关于c++ - 调用了错误的模板函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42420202/

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