gpt4 book ai didi

c++ - 模板编程 : ambiguous call to overloaded function

转载 作者:行者123 更新时间:2023-11-30 00:48:52 25 4
gpt4 key购买 nike

我正在实现一个排序算法作为个人培训(没有家庭作业!)。我有以下代码(不包括进口等):

        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)。根据我的理解,这个电话不应该是模棱两可的。同样在第二个排序函数中调用第一个排序函数的模板参数没有任何效果。

我在这里错过了什么?为什么编译器认为第二个调用“不明确”?

最佳答案

问题有两方面。

首先,sort 是通过 ADL 找到的,因此您会得到两个重载,并且它们都匹配。一般来说,当您不尝试 ADL 重载时,将函数命名为与 std 函数相同是令人担忧的,因为 ADL 可能导致歧义。

现在,这仅在从 namespace std; 传递类型时发生。有时迭代器来自此命名空间,但在这种情况下不是:array 使用原始指针迭代器。 ADL 查找 std::sort 的触发器是 std::function

这让我想到了下一个问题:上面代码中的 std::function 获得的东西很少,损失的东西也很多。将其替换为 auto。将低级排序算法传递给可内联的比较对象。

您仍然不想将其称为排序。如果您将其称为 sort,则需要使用命名空间限定调用,或 (sort) 以阻止 ADL。

ADL 规则是“普通”函数、参数 namespace 中的函数、参数指向的 namespace 以及参数的模板参数等都被考虑用于重载决议。这是参数相关查找,或 ADL,或 Koenig 查找。这意味着当使用来自另一个命名空间的类型时,可能会发生某种命名空间污染(这很可悲),但它也会产生一些不错的魔法(比如 std::cout << "hello world\n";`)

关于c++ - 模板编程 : ambiguous call to overloaded function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30421911/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com