gpt4 book ai didi

C++ 为什么当它们 100% 看起来匹配时会出现错误 "no matching function"?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:22:23 25 4
gpt4 key购买 nike

我不明白为什么我会收到一条错误消息,指出我的函数与我定义的模板函数不匹配。在我看来,它们看起来完全一样。这是我调试中的错误:

错误:没有匹配函数来调用 'mergesort' newVec = mergesort(vec.begin(),vec.end());

所以我可以学习和编写更好的通用函数和模板,我需要更改什么才能消除该错误? (需要说明的是,我并不是在寻求有关我的归并排序算法的帮助 - 我知道它有问题,但我会解决它们。)

#include <iostream>
#include <vector>

using namespace std;

template <typename T>
vector<T> mergesort(typename vector<T>::iterator, typename vector<T>::iterator);

int main() {
vector<int> vec{ 50, 5, 40, 10, 30, 15, 20, 20, 10, 25 };
vector<int> newVec;

newVec = mergesort(vec.begin(),vec.end()); //Doesn't match???

cout << "before:";
for (auto x : vec) cout << x << ' '; cout << '\n';
cout << "after :";
for (auto x : newVec) cout << x << ' '; cout << '\n';
return 0;
}

template <typename T>
vector<T> mergesort(typename vector<T>::iterator begin, typename vector<T>::iterator end){
vector<T> newVector;
copy(begin, end, newVector);

if(begin!=end){
vector<T> tmp1;
vector<T> tmp2;

auto dist = distance(newVector.begin(),newVector.end());
auto distance1 = dist/2;
auto distance2 = (dist/2+1);

auto mid1 = newVector.begin();
auto mid2 = newVector.begin();

advance(mid1,distance1);
advance(mid2,distance2);

tmp1 = mergesort(newVector.begin(), mid1);
tmp2 = mergesort(mid2, newVector.end());

merge(tmp1.begin(), mid1, mid2, tmp2.end(), newVector.begin());

return newVector;
} else {
return newVector;
}
}

最佳答案

问题是这是一个非推导的上下文:

template <typename T>
vector<T> mergesort(typename vector<T>::iterator, typename vector<T>::iterator);
^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^

这个函数调用编译失败的原因有 two good 答案。

至于如何修复它 - 即使上面的代码确实有效,也没有理由将您的功能限制在 vector 迭代器上。您也可以对其他容器进行合并排序。所以只需推导任何迭代器:

template <typename Iterator>
vector<T> mergesort(Iterator, Iterator);

此外,通常我们通常希望合并修改提供的范围,而不是返回新容器。所以真的更喜欢:

template <typename Iterator>
void mergesort(Iterator, Iterator);

您的代码中还有其他一些问题。在此处调用 std::merge():

merge(tmp1.begin(), mid1, mid2, tmp2.end(), newVector.begin());

newVector 在此调用之前为空,因此我们将覆盖它不拥有的内存。你会想要做的:

newVector.reserve(dist);
merge(tmp1.begin(), mid1, mid2, tmp2.end(), std::back_inserter(newVector));

关于C++ 为什么当它们 100% 看起来匹配时会出现错误 "no matching function"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37105971/

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