C++ 为什么当错误看起来 100% 匹配时会出现错误"no matching function"?
C++ Why does error "no matching function" appear when it 100% looks like they match?
我不明白为什么我会收到一个错误,说我的函数与我定义的模板函数不匹配。对我来说,它们看起来完全一样。以下是我调试中的错误:
error: no matching function for call to '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);
^^^^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^^^^
关于这个函数调用编译失败的原因,有两个很好的答案。
至于如何修复它——即使上面的代码确实有效,也没有理由将您的功能限制为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));
相关文章:
- 我在 ifstream input_file(文件名)行中收到错误"no matching function to call";
- 学习 c++,编译错误"no matching function for call"
- 尝试查找两组点的交集,错误"No viable overloaded '=' "
- 如果子类中没有构造函数方法,则错误"no matching function for call to 'LGame::LGame(String&)'"
- 如何修复以下错误"no match for call to '(std::tr1::shared_ptr<_iobuf*>) (FILE*&)'"
- 函数模板不起作用,出现错误"No suitable user-defined conversion"
- GDB 列表错误"No such file or directory"
- 运算符重载错误"no match for operator error"
- 调用布尔函数但收到错误"no matching function to call"?
- 为什么编译器显示错误"no match for 'operator[]' (operand types are 'carti' and 'int')"
- 模板化重载运算符的编译错误"No global operator found"
- 意外错误"no matching function for call to",需要没有参数的构造函数
- C++ 为什么当错误看起来 100% 匹配时会出现错误"no matching function"?
- C++向量和错误"no instance of overloaded function"
- C++结构错误"No matching function for call..."
- 提升精神语法错误 - "no type named ‘size’ in ‘struct boost::spirit::unused_type’"
- 错误"No Entry point"
- 为什么我在 Linux 上收到错误"no matching function for call to A::A(A)",而在 Windows 上没有
- Clang 输出错误"no matching construct for initialization"
- 接收错误"no matching function for call to 'getline(std::ifstream&, int&, char)'"