模板编程:对重载函数的歧义调用

简·亨克

我正在将排序算法作为个人培训来实现(没有功课!)。我有以下代码(不包括导入等):

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

我在这里想念什么?编译器为何将第二个调用视为“模棱两可”?

Yakk-亚当·内夫罗蒙特

问题有两个。

首先,sort是通过ADL找到的,因此您将获得两个重载,并且它们都匹配。通常,std由于ADL可能引起歧义,因此命名功能与不尝试ADL重载时的功能相同

现在,仅当从传递namespace std;迭代器的类型时才发生这种情况,有时迭代器是从此名称空间获取的,但在这种情况下则不会:array使用原始指针迭代器。查找ADL的触发因素std::sortstd::function

这就引出了下一个问题:std::function在上述代码中,几乎没有什么收获,而有很多损失替换为auto将低级排序算法传递给可内联的比较对象。

您仍然不想调用它sort如果调用它sort,则需要使用名称空间来限定调用,或(sort)阻止ADL。

ADL规则是考虑“重载”函数,以及参数命名空间中的函数,参数指向的命名空间,参数指向的命名空间以及参数的模板参数等。这是依赖于参数的查询,或ADL或Koenig查找。这意味着当使用另一个命名空间中的类型时,可能会发生某种类型的命名空间污染(这很可悲),但这也会带来一些不错的魔术效果(例如std :: cout <<“ hello world \ n”;`)

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C ++模板和对重载函数的歧义调用

来自分类Dev

C ++模板和对重载函数的歧义调用

来自分类Dev

对重载整数构造函数的歧义调用

来自分类Dev

可变参数模板函数中对重载函数的歧义调用

来自分类Dev

VS2013中使用可变参数模板时“对重载函数的歧义调用”

来自分类Dev

在VS2013中使用可变参数模板时“对重载函数的歧义调用”

来自分类Dev

如何解决“ fpclassify”:对重载函数的歧义调用

来自分类Dev

'sqrt':对重载函数.. \ assimp \ vector3.inl的歧义调用

来自分类Dev

当我添加头文件“ boost / function”时,使用“ bind”对重载函数进行歧义调用

来自分类Dev

模板函数调用歧义错误

来自分类Dev

歧义调用-模板化函数

来自分类Dev

对基类中的重载函数的歧义调用

来自分类Dev

错误:对重载函数的模棱两可的调用

来自分类Dev

对重载函数find_first_not_of的模糊调用

来自分类Dev

为什么对重载函数的调用不明确?

来自分类Dev

对带有函数参数的重载函数进行模糊歧义调用

来自分类Dev

类模板构造函数重载解析度歧义

来自分类Dev

解决重载函数的歧义

来自分类Dev

重载函数的歧义

来自分类Dev

调用重载的构造函数会产生歧义错误C ++

来自分类Dev

我可以在重载的模板函数和更受限的模板函数之间消除歧义吗?

来自分类Dev

如何解决对重载定义的歧义引用

来自分类Dev

重载类方法的歧义调用

来自分类Dev

函数模板的部分排序-歧义调用

来自分类Dev

C ++ 11 auto,std :: function和对重载函数的模糊调用

来自分类Dev

使用float会导致“对重载函数的调用不明确”错误

来自分类Dev

错误C2668:'boost :: bind':对重载函数的模棱两可的调用

来自分类Dev

如何消除重载函数的歧义

来自分类Dev

错误:无法解析对重载函数的引用

Related 相关文章

  1. 1

    C ++模板和对重载函数的歧义调用

  2. 2

    C ++模板和对重载函数的歧义调用

  3. 3

    对重载整数构造函数的歧义调用

  4. 4

    可变参数模板函数中对重载函数的歧义调用

  5. 5

    VS2013中使用可变参数模板时“对重载函数的歧义调用”

  6. 6

    在VS2013中使用可变参数模板时“对重载函数的歧义调用”

  7. 7

    如何解决“ fpclassify”:对重载函数的歧义调用

  8. 8

    'sqrt':对重载函数.. \ assimp \ vector3.inl的歧义调用

  9. 9

    当我添加头文件“ boost / function”时,使用“ bind”对重载函数进行歧义调用

  10. 10

    模板函数调用歧义错误

  11. 11

    歧义调用-模板化函数

  12. 12

    对基类中的重载函数的歧义调用

  13. 13

    错误:对重载函数的模棱两可的调用

  14. 14

    对重载函数find_first_not_of的模糊调用

  15. 15

    为什么对重载函数的调用不明确?

  16. 16

    对带有函数参数的重载函数进行模糊歧义调用

  17. 17

    类模板构造函数重载解析度歧义

  18. 18

    解决重载函数的歧义

  19. 19

    重载函数的歧义

  20. 20

    调用重载的构造函数会产生歧义错误C ++

  21. 21

    我可以在重载的模板函数和更受限的模板函数之间消除歧义吗?

  22. 22

    如何解决对重载定义的歧义引用

  23. 23

    重载类方法的歧义调用

  24. 24

    函数模板的部分排序-歧义调用

  25. 25

    C ++ 11 auto,std :: function和对重载函数的模糊调用

  26. 26

    使用float会导致“对重载函数的调用不明确”错误

  27. 27

    错误C2668:'boost :: bind':对重载函数的模棱两可的调用

  28. 28

    如何消除重载函数的歧义

  29. 29

    错误:无法解析对重载函数的引用

热门标签

归档