【发布时间】:2016-05-08 23:37:05
【问题描述】:
我不明白为什么我收到一个错误,指出我的函数与我定义的模板函数不匹配。对我来说,它们看起来一模一样。这是我调试中的错误:
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;
}
}
【问题讨论】:
-
要搜索的词是non-deduced context。
-
@T.C.好的,我去查一下。
-
@T.C. - 这个阶段非常有用,现在我知道我的编译器无法推断出它。但是我已经尝试了几个示例中显示的内容,尤其是这个示例:stackoverflow.com/questions/25245453/… ...我仍然无法理解这个 - 我确信这是一个简单的概念,但我就是不明白我做错了什么。
-
你为什么用
typename vector<T>::iterator而不是vector<T>::iterator? -
因为我的编译器说我在调试时需要它,而当我这样做时,大量的错误消息消失了。我知道这不是一个好的答案,但这就是原因。
标签: c++ algorithm templates c++11 generic-programming