【发布时间】:2015-05-24 09:22:03
【问题描述】:
我正在实施一种排序算法作为个人培训(没有家庭作业!)。 我有以下代码(不包括进口等):
template<class RandomIt, class Compare>
void sort(RandomIt first, RandomIt last, Compare comp)
{
/* actual sorting code is here */
}
template<class RandomIt>
void sort(RandomIt first, RandomIt last)
{
std::function<bool(decltype(*first), decltype(*last))> comp = [](decltype(*first) a, decltype(*last) b)
{
return a < b;
};
sort (first, last, comp);
}
尝试使用测试数组调用此代码
auto test_array_1 = std::make_unique <std::array < uint64_t,SORTING_TEST_LENGTH >> ();
std::copy(std::cbegin(*template_array), std::cend(*template_array), std::begin(*test_array_1));
sort(std::begin(*test_array_1), std::end(*test_array_1));
编译器抱怨“对重载函数的模糊调用”(VC++ C2668)。根据我的理解,这个电话不应该是模棱两可的。同样在第二个排序函数中调用第一个排序函数的模板参数没有任何效果。
我在这里缺少什么?为什么编译器会认为第二次调用“模棱两可”?
【问题讨论】:
-
尝试给出整个错误......我们的任何帮助都只是在黑暗中拍摄。
-
如果你有一个
using namespace foo(std是foo的明显罪魁祸首),它可能已经有一个sort。 -
有趣的是,我的代码中没有
using namespace std(我讨厌命名空间污染)。 -
欢迎来到ADL,这里可以找到
std::sort,因为std::begin产生的迭代器在std命名空间,拉入std::sort。 -
Argument Dependent Lookup - 基本上,对于不合格的函数调用,查看参数的命名空间、它们的模板参数、它们的基类,以及它们的狗曾曾祖母的命名空间。跨度>
标签: c++ templates c++11 visual-c++