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

4

5 回答 5

15

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
于 2009-08-19T14:26:47.453 回答
3

因为 obj2 是一个函数。看到这个

于 2009-08-19T14:29:52.533 回答
1

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

obj2 需要类似于

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

或 obj1 使用的函子类型。

于 2009-08-19T14:35:47.873 回答
1

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

使用,整数 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;
}
于 2009-08-19T14:44:21.917 回答
0
#include<iostream>
#include<vector>
#include<algorithm>

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

类 CompareParts {
public:
bool operator()(const Integer & p1,const Integer & p2)
{
return p1.m }
};

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

于 2009-08-19T14:43:03.243 回答