Функция сортировки не работает с объектным объектом, созданным в стеке?
#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 во второй функции сортировки приводит к ошибке компилятора.
Ответы
Ответ 1
Integer obj2()
не является определением объекта, это объявление функции с именем obj2
, возвращающее Integer
(помещает его вне любой функции, чтобы понять, почему это так). Иногда это происходит и с более сложными конструкциями, где это может быть еще более запутанным. Некоторые называют это самым неприятным анализом.
Вот обещанный пример более сложного случая:
struct Foo {};
struct Bar { Bar(Foo); };
Bar quxx(Foo()); // quxx is a function
Здесь quxx
- это функция, возвращающая панель и принимающая (указатель) к функции, возвращающей Foo и без параметров. Вы могли бы написать ту же декларацию более четко:
Bar quxx(Foo (*fn)()); // quxx is the same function as above
Чтобы получить определение переменной, инициализированной конструктором с помощью Foo, вы можете добавить уровень скобок:
Bar quux((Foo())); // quux is a variable
Ответ 2
Потому что obj2 - это функция. См. this
Ответ 3
obj2 не является двоичным и недействителен в качестве третьего параметра для std:: sort
obj2 должно быть чем-то вроде
// Return whether first element is greater than the second
bool UDgreater ( int elem1, int elem2 )
{
return elem1 > elem2;
}
или тип функтора, используемый obj1.
Ответ 4
Нет определения конструктора аргументов без аргументов.
Использовать, 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;
}
Ответ 5
#include<iostream>
#include<vector>
#include<algorithm>
класс Integer
{
общественности:
int m;
Целое число (int a): m (a) {};
};
class CompareParts
{
общественности:
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