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

发布于 2024-08-02 21:39:24 字数 779 浏览 8 评论 0原文

#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 在第二个排序函数中会导致编译器错误。

#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);
    }

why is obj2 in second sort function leads to compiler error.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

怪异←思 2024-08-09 21:39:24

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() isn't the definition of an object, it is the declaration of a function named obj2 returning an Integer (put it outside any function to understand why it is so). This occurs also sometimes with more complex constructions where it can be even more confusing. Some name this the most vexing parse.

Here is the promised example of a more complex case:

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

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

Here quxx is a function returning a Bar and taking (a pointer) to a function returning a Foo and without parameters. You could write the same declaration more clearly like this:

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

To get the definition of a variable initialized with the constructor taking a Foo, you can add a level of parenthesis:

Bar quux((Foo())); // quux is a variable
水溶 2024-08-09 21:39:24

因为 obj2 是一个函数。请参阅

Because obj2 is a function. See this

信愁 2024-08-09 21:39:24

obj2 不是 BinaryPredicate,并且无效,因为 std::sort

obj2 的第三个参数需要类似于

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

obj1 使用的函子类型。

obj2 is not a BinaryPredicate and is invalid as the third parameter to std::sort

obj2 needs to be something like

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

or the functor type used by obj1.

心房敞 2024-08-09 21:39:24

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

使用,整数 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;
}

There is no definition of no argument constructor.

Use, Integer 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;
}
南薇 2024-08-09 21:39:24
#include<iostream>
#include<vector>
#include<algorithm>

整数类
{

公众:
int m;
整数(int a):m(a){};
};

比较零件类
{
公众:
bool 运算符()(const Integer & p1,const Integer & p2)
{
返回 p1.m
}
};

int main()
{
std::向量 vecInteger;
vecInteger.push_back(整数(12));
vecInteger.push_back(Integer(13));
vecInteger.push_back(Integer(5));
vecInteger.push_back(Integer(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

#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
}
};

int main()
{
std::vector 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));

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;

}

Output:
5 7 9 12 13

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文