0

我无法编译以下代码

namespace sequential_sort
{
template<class T>
void sort(std::list<T>& source)
{
    sort(source.begin(), source.end()); //(1)
}
template<class Iter>
void sort(Iter begin, Iter end)
{
    if(begin == end)
         return;
    typedef Iter::value_type value_type;
    value_type value = *(begin);
    Iter part = std::partition(begin, end, [&value](const    value_type&->bool{return   t < value;});
    sort(begin, part);
    Iter divide = part;
    divide++;
    sort(divide, end); 
}
}

它说在第 (1) 行我有错误 C2688 模糊调用重载函数。我不明白为什么,重载函数甚至有不同数量的参数?

4

1 回答 1

0

有几个问题在起作用:

1)你需要在两个参数一个之前sequential_sort::sort声明你的单参数函数,除非你想要另一个函数。您可能看不到这样做的效果,因为您使用的是 Windows C++ 编译器,它在这方面不符合标准。应该发生的是,它是明确选择的,并且不会编译,因为它需要随机访问迭代器(有一个你应该使用的成员函数而不是)。sortstd::sortstd::listsortstd::sort

2)一旦修复,由于您将std::list迭代器传递给两个参数sort,因此也考虑了参数相关查找(ADL)方法std::sort。这就是模棱两可的原因。您可以通过具体说明sort要使用的两个参数来解决此问题:

#include <list>
#include <algorithm>

namespace sequential_sort
{

template<class Iter>
void sort(Iter begin, Iter end) { }

template<class T>
void sort(std::list<T>& source)
{
  sequential_sort::sort(source.begin(), source.end()); //(1)
//^^^^^^^^^^^^^^^
}

}
于 2013-06-27T09:43:03.273 回答