【问题标题】:Using curly brackets instead of make_pair giving error使用大括号而不是 make_pair 给出错误
【发布时间】:2021-11-23 18:21:19
【问题描述】:

它给出no instance of overloaded function "lower_bound" matches the argument list 错误。我不理解这种行为,因为大括号在制作一对时通常可以正常工作。

使用大括号:

vector<pair<int, int>> a;
auto ptr = lower_bound(a.begin(), a.end(), {2, 3});

使用 make 对:

vector<pair<int, int>> a;
auto ptr = lower_bound(a.begin(), a.end(), make_pair(2, 3));

【问题讨论】:

  • 编译器如何从{2, 3} 推断出std::pair 甚至在原则上?注意迭代器类型不参与这个推演:template&lt;class ForwardIt, class T&gt; ForwardIt lower_bound( ForwardIt first, ForwardIt last, const T&amp; value );
  • @Evg 所以,我需要像 std::pair&lt;int, int&gt;{2, 3} 那样转换它吗?
  • 你可以说std::pair(2, 3)

标签: c++ stl lower-bound


【解决方案1】:

在这种情况下,编译器无法将{2, 3} 推导出为std::pair&lt;int, int&gt;。见lower_bound的声明:

template< class ForwardIt, class T >
ForwardIt lower_bound( ForwardIt first, ForwardIt last, const T& value );

编译器不能假定T 应该等于decltype(*first),因为不一定是这样 - 只要求它们具有可比性。

您需要通过实际命名您想要使用的类型来消除歧义 - 通过调用 std::make_pair(2, 3) 或通过创建临时:std::pair{2, 3}(模板参数从 C++17 开始可以省略,对于早期标准,您需要 @ 987654330@ 或 make_pair)。

【讨论】:

    【解决方案2】:

    answer provided by Yksisarvinen 解释了为什么您的第一个代码 sn-p 无法编译(即,为什么编译器无法正确推断出lower_bound 的第三个参数的类型);它还提供了两种解决问题的方法,这两种方法都非常明智。

    然而,还有第三种可能性——尽管它是否“合理”是一个主观的决定。因此,为了完整起见,我将在此处说明该方法……

    您可以显式地在调用中为lower_bound 提供模板参数,从而使编译器能够正确解释第三个参数的类型:

    #include <vector>
    #include <algorithm>
    #include <type_traits>
    using namespace std;
    int main(void)
    {
        vector<pair<int, int>> a;
        auto ptr = lower_bound< decltype(a.begin()),pair<int,int> >(a.begin(),a.end(),{2,3});
        //...
        return 0;
    }
    

    以下是lower_bound的规范(取自cppreference):

    template< class ForwardIt, class T >
    ForwardIt lower_bound( ForwardIt first, ForwardIt last, const T& value );
    

    因此,在我提供的代码中,我们明确指定了ForwardIt class T(如pair&lt;int,int&gt;)的类型,因此第三个函数参数将是已知是对这种类型的const引用,并且不需要对该类型的推导

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-01-17
      • 2015-06-29
      • 1970-01-01
      • 1970-01-01
      • 2023-01-21
      • 1970-01-01
      • 2023-03-09
      • 1970-01-01
      相关资源
      最近更新 更多