Функция сортировки не работает с объектом функции, созданным в стеке? - PullRequest
0 голосов
/ 19 августа 2009
#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 во второй функции сортировки приводит к ошибке компилятора.

Ответы [ 5 ]

15 голосов
/ 19 августа 2009

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
3 голосов
/ 19 августа 2009

Потому что obj2 - это функция. Смотри это

1 голос
/ 19 августа 2009

Нет определения конструктора аргументов.

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;
}
1 голос
/ 19 августа 2009

obj2 не является BinaryPredicate и недопустим в качестве третьего параметра для std :: sort

obj2 должно быть что-то вроде

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

или тип функтора, используемый obj1.

0 голосов
/ 19 августа 2009
#include<iostream>
#include<vector>
#include<algorithm>

класс Integer
{
общественности:
int m;
Целое число (int a): m (a) {};
};

класс {
общественности:
оператор bool () (const Integer & p1, const Integer & p2)
{
возврат 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

...