【问题标题】:Sort function does not work with function object created on stack?排序函数不适用于在堆栈上创建的函数对象?
【发布时间】:2009-08-19 14:24:09
【问题描述】:
#include<iostream>
#include<vector>
#include<algorithm>
class Integer
    {
public:
    int m;
    Integer(int a):m(a){};
    };
class CompareParts
    {
    public:
        bool operator()(const Integer & p1,const Integer & p2)
            {
            return p1.m<p2.m;
            }
    }obj1;
int main()
    {
    std::vector<Integer> vecInteger;
    vecInteger.push_back(Integer(12));
    vecInteger.push_back(Integer(13));
    vecInteger.push_back(Integer(5));
    vecInteger.push_back(Integer(7));
    vecInteger.push_back(Integer(9));
    Integer obj2();
    std::sort(vecInteger.begin(),vecInteger.end(),obj1);
    std::sort(vecInteger.begin(),vecInteger.end(),obj2);
    }

为什么第二个排序函数中的obj2会导致编译器错误。

【问题讨论】:

  • 请务必将编译错误添加到问题中。这将有助于诊断问题。
  • "排序函数不使用在堆栈上创建的函数对象?"你在标题中漏掉了一个字。我必须点击才能看到你的意思是编译而不是工作。

标签: c++ sorting functor


【解决方案1】:

Integer obj2() 不是对象的定义,它是一个名为obj2 的函数的声明,它返回一个Integer(将其放在任何函数之外以了解其原因)。这有时也会发生在更复杂的结构中,这可能会更加令人困惑。有人将其命名为最令人头疼的解析

这是一个更复杂案例的承诺示例:

struct Foo {};
struct Bar { Bar(Foo); };

Bar quxx(Foo()); // quxx is a function

这里的quxx 是一个返回 Bar 的函数,并将(一个指针)指向一个返回 Foo 且不带参数的函数。您可以像这样更清楚地编写相同的声明:

Bar quxx(Foo (*fn)()); // quxx is the same function as above

要获取使用 Foo 的构造函数初始化的变量的定义,您可以添加一层括号:

Bar quux((Foo())); // quux is a variable

【讨论】:

  • 是的,正确的语法是“Integer obj2;”。除此之外,您可能想要创建一个 CompareParts 对象,并且您应该更接近结果。
  • 嗯,没错。声明出现的点不一定是它声明的实体所在的点。在这种情况下,它使用局部声明来声明一个全局函数。
  • AProgrammer 是正确的——它是一个函数声明。是的,您可以在另一个函数中声明一个函数。
  • @Chickencha C++ 从 C 中获取最重要的规则,即如果某些内容可能被解析为声明,它将被解析为声明。
  • 来自标准的一些评论:8.5 Initializers /8: "[注意:由于初始化程序的语法不允许 ()@987654330 @ 不是 X 类的对象的声明,而是一个不带参数并返回 X 的函数的声明。形式() 在某些其他初始化上下文(5.3.4、5.2.3、12.6.2)中是允许的。]" 希望能解释这个问题。
【解决方案2】:

因为 obj2 是一个函数。见this

【讨论】:

    【解决方案3】:

    obj2 不是 BinaryPredicate,作为 std::sort 的第三个参数无效

    obj2 需要类似于

    // Return whether first element is greater than the second
    bool UDgreater ( int elem1, int elem2 )
    {
       return elem1 > elem2;
    }
    

    或obj1使用的函子类型。

    【讨论】:

      【解决方案4】:

      没有无参数构造函数的定义。

      使用,整数 obj2(0);

      #include<iostream>
      #include<vector>
      #include<algorithm>
      class Integer
      {
           public:
           int m;
           Integer(int a):m(a){};
           bool operator()(const Integer p1,const Integer p2)
           {
            return p1.m<p2.m;
           }
      };
      class CompareParts
      {    public:
           bool     operator()(const Integer  p1,const Integer p2)
           {
               return p1.m<p2.m;
               }
      }obj1;
      
      int main()
      {
          std::vector<Integer> vecInteger;
          vecInteger.push_back(Integer(12));
          vecInteger.push_back(Integer(13));
          vecInteger.push_back(Integer(5));
          vecInteger.push_back(Integer(7));
          vecInteger.push_back(Integer(9));
          Integer obj2(0);
          std::sort(vecInteger.begin(),vecInteger.end(),obj1);
          std::sort(vecInteger.begin(),vecInteger.end(),obj2);
      
          return 0;
      }
      

      【讨论】:

        【解决方案5】:
        #include<iostream>
        #include<vector>
        #include<algorithm>
        

        整数类
        {
        公开:
        整数米;
        整数(int a):m(a){};
        };

        类 CompareParts {
        公开:
        bool operator()(const Integer & p1,const Integer & p2)
        {
        返回 p1.m }
        };

        int main()
        {
        标准::向量向量;
        vecInteger.push_back(整数(12));
        vecInteger.push_back(整数(13));
        vecInteger.push_back(整数(5));
        vecInteger.push_back(整数(7));
        vecInteger.push_back(整数(9));

        std::sort(vecInteger.begin(),vecInteger.end(),CompareParts()); 
        typedef vector<Integer>::const_iterator Iter;
        Iter beg = vecInteger.begin();
        Iter end = vecInteger.end();
        
        for (Iter iter = beg; iter != end; ++iter)
            cout << (*iter).m << " ";
        
        cout << endl;
        

        }

        输出: 5 7 9 12 13

        【讨论】:

          猜你喜欢
          • 2015-04-23
          • 1970-01-01
          • 2016-03-06
          • 1970-01-01
          • 2010-12-08
          • 2013-12-13
          • 2013-12-09
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多