排序功能不适用于在堆栈上创建的功能对象?

yes*_*aaj 0 c++ sorting functor

#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);
    }
Run Code Online (Sandbox Code Playgroud)

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

APr*_*mer 15

Integer obj2()它不是一个对象的定义,它是一个名为obj2return an 的函数的声明Integer(将它放在任何函数之外以理解它为什么会这样).有时这种情况会发生在更复杂的结构中,甚至可能更令人困惑.有人将此称为最令人烦恼的解析.

以下是更复杂案例的承诺示例:

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

Bar quxx(Foo()); // quxx is a function
Run Code Online (Sandbox Code Playgroud)

quxx是一个函数返回一个Bar并将(一个指针)带到一个返回Foo且没有参数的函数.您可以更清楚地写出相同的声明:

Bar quxx(Foo (*fn)()); // quxx is the same function as above
Run Code Online (Sandbox Code Playgroud)

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

Bar quux((Foo())); // quux is a variable
Run Code Online (Sandbox Code Playgroud)

  • 是的,正确的语法是"Integer obj2;".除此之外,你可能想要创建一个CompareParts对象,你应该更接近结果. (5认同)
  • @Chickencha C++从C中获取了一个重要的规则,即如果某些内容可能被解析为声明,它将被解析为声明. (2认同)