webForumDet fria alternativet

problem med bind2nd och funktionsobjekt

8 svar · 238 visningar · startad av FredrikF

FredrikFMedlem sedan maj 200391 inlägg
#1

Jag vill använda algoritmen find_if på en vektor av min klass Airline (som har ett heltal no_of_planes som attribut). Mitt kriterie för find_if är att värdet no_of_planes skall vara större än 4. Jag har en egen funktionsklass som heter Greater:

class Greater{

public: 
	bool operator()(Airline& lhs, int value){
		
		return (lhs.getPlanes() > value);
	}
};

när jag anropar find_if:

vector<Airline>::iterator it99 = find_if(Airport.begin(), Airport.end(), bind2nd(Greater(), 4));

får jag ett antal kompileringsfel

Compiling...
test.cpp
c:\program\microsoft visual studio\vc98\include\functional(175) : error C2039: 'first_argument_type' : is not a member of 'Greater'
        d:\greater.h(8) : see declaration of 'Greater'
        D:\test.cpp(52) : see reference to class template instantiation 'std::binder2nd<class Greater>' being compiled
c:\program\microsoft visual studio\vc98\include\functional(175) : error C2065: 'first_argument_type' : undeclared identifier
        D:\\test.cpp(52) : see reference to class template instantiation 'std::binder2nd<class Greater>' being compiled
c:\program\microsoft visual studio\vc98\include\functional(176) : error C2039: 'result_type' : is not a member of 'Greater'
        d:\greater.h(8) : see declaration of 'Greater'
        D:\test.cpp(52) : see reference to class template instantiation 'std::binder2nd<class Greater>' being compiled
c:\program\microsoft visual studio\vc98\include\functional(176) : error C2065: 'result_type' : undeclared identifier
        D:\test.cpp(52) : see reference to class template instantiation 'std::binder2nd<class Greater>' being compiled
c:\program\microsoft visual studio\vc98\include\functional(176) : fatal error C1903: unable to recover from previous error(s); stopping compilation
Error executing cl.exe.

test.obj - 5 error(s), 0 warning(s)

Jag misstänker att min funktionsklass är felkonstruerad. Någon som är bra på funktionsklasser, std-algoritmer predikat, osv? I synnerhet bind2nd...

Peter SMedlem sedan dec. 20025 483 inlägg
#2
#include <functional>

class Greater : public binary_function<Airline, int, bool> {
    public:
        bool operator ()(const Airline& lhs, int value) const {
            return lhs.getPlanes() > value;
        }
};

:)

FredrikFMedlem sedan maj 200391 inlägg
#3

Peter S skrev:

#include <functional>

class Greater : public binary_function<Airline, int, bool> {
    public:
        bool operator (const Airline& lhs, int value)() const {
            return lhs.getPlanes() > value;
        }
};

:)

Tack. Kastade fram paranteserna så att operatoröverlagringen fick sina paranterser innan parameterlistan och inte efter som du skrev.

Det fungerar fortfarande inte så bra. Kompilatorn tjatar om en typomvandling som inte går så bra. This-pekaren i airline-klassen kan inte typas om från const Airline till Airline-referens.

Peter SMedlem sedan dec. 20025 483 inlägg
#4

My bad, självklart skall parenteserna byta plats :r

Hur ser definitionen ut för Airline-klassen?

:)

spangoMedlem sedan juni 20008 205 inlägg
#5

Jag tror att det kan bero på att du tar emot en referens i funktorn, jag har för mig att det kan orsaka att det bildas en referens till en referens, vilket inte funkar. Prova att ta emot en const Airline i stället för const Airline& i operator().

FredrikFMedlem sedan maj 200391 inlägg
#6
#include "Airline.h"

Airline::Airline(){
	name = "";
	planesOnAirport = 0;
}

Airline::Airline(string pName, double pPlanesOnAirport)
: name(pName), planesOnAirport(pPlanesOnAirport){}

Airline::~Airline(){}

Airline::Airline(const Airline& rhs){
	name = rhs.name;
	planesOnAirport = rhs.planesOnAirport;
}

void Airline::setName(string pName){
	name = pName;
}

string Airline::getName(){
	return name;
}

void Airline::setPlanes(double pPlanesOnAirport){
	planesOnAirport = pPlanesOnAirport;
}

double Airline::getPlanes(){
	return planesOnAirport;
}

bool Airline::operator ==(Airline& rhs) const{
	return name == rhs.name;
}
Peter SMedlem sedan dec. 20025 483 inlägg
#7

Testa med att ändra så att getPlanes() returnerar ett konstant värde:

double getPlanes() const { /* ... */ }

:)

FredrikFMedlem sedan maj 200391 inlägg
#8

Tackar, den gick med på const.

FredrikFMedlem sedan maj 200391 inlägg
#9

spango skrev:

Jag tror att det kan bero på att du tar emot en referens i funktorn, jag har för mig att det kan orsaka att det bildas en referens till en referens, vilket inte funkar. Prova att ta emot en const Airline i stället för const Airline& i operator().

Gick inge vidare att köra utan referens. Tack för förslaget ändå.

144 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
140 ms — hämta tråd, inlägg och bilagor (db)