C++ C++;为什么会有错误;“没有匹配功能”;在100%看起来匹配时出现?

C++ C++;为什么会有错误;“没有匹配功能”;在100%看起来匹配时出现?,c++,algorithm,templates,c++11,generic-programming,C++,Algorithm,Templates,C++11,Generic Programming,我不明白为什么会出现一个错误,说明我的函数与定义的模板函数不匹配。对我来说,它们看起来一模一样。以下是我的调试中的错误: 错误:调用'mergesort'newVec=mergesort(vec.begin(),vec.end())时没有匹配的函数 因此,我可以学习和编写更好的通用函数和模板,我需要做哪些更改才能消除错误?(说得清楚一点,我并不是在寻求我的mergesort算法的帮助——我知道它有问题,但我会解决的。) #包括 #包括 使用名称空间std; 模板 向量合并排序(typename向

我不明白为什么会出现一个错误,说明我的函数与定义的模板函数不匹配。对我来说,它们看起来一模一样。以下是我的调试中的错误:

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

因此,我可以学习和编写更好的通用函数和模板,我需要做哪些更改才能消除错误?(说得清楚一点,我并不是在寻求我的mergesort算法的帮助——我知道它有问题,但我会解决的。)

#包括
#包括
使用名称空间std;
模板
向量合并排序(typename向量::迭代器,typename向量::迭代器);
int main(){
向量向量{50,5,40,10,30,15,20,20,10,25};
向量newVec;
newVec=mergesort(vec.begin(),vec.end());//不匹配???

cout问题在于这是一个非推断的上下文:

template <typename T>
vector<T> mergesort(typename vector<T>::iterator, typename vector<T>::iterator);
                    ^^^^^^^^^^^^^^^^^^^^          ^^^^^^^^^^^^^^^^^^^^
此外,我们通常希望合并修改提供的范围,而不是返回新容器。因此,我们更喜欢:

template <typename Iterator>
void mergesort(Iterator, Iterator);
newVector
在此调用之前为空,因此我们将覆盖它不拥有的内存。您需要执行以下操作:

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

要搜索的术语是非推断上下文。@T.C.好的,我会查一下。@T.C.-那个阶段真的很有用,现在我知道我的编译器无法推断它。但我已经尝试了几个示例中显示的内容,尤其是这个示例:……我仍然无法理解这个问题-我确信这是一个简单的概念,但我就是不知道“我不明白我做错了什么。为什么你使用
typename vector::iterator
而不是
vector::iterator
?因为我的编译器说我在调试时需要它,当我这么做的时候,大量的错误信息消失了。我知道这不是一个好答案,但这就是为什么。好答案,这让我找到了正确的方向-谢谢!
template <typename Iterator>
void mergesort(Iterator, Iterator);
merge(tmp1.begin(), mid1, mid2, tmp2.end(), newVector.begin());
newVector.reserve(dist);
merge(tmp1.begin(), mid1, mid2, tmp2.end(), std::back_inserter(newVector));