Egtl was simples, aber es will mir nicht in den Kopf....[UPDATED]
-
Hallo!
Ich habe folgendes Problem (minimal Beispiel):
// myFunc nimmt einen Pointer auf ObjA und gibt Pointer auf ObjB zurück ObjB * myFunc(ObjA * o) { // irgendwas kommt hier noch... return &(stdVector->at(o->nr())); } // meine Hauptfunktion void function main() { ObjA * o1 = &(myObjVector->at(0)); // o1 ist also pointer, und zeigt auf das object im std:vector an stelle 0. ObjB * o2 = myFunc(o1); // nun übergebe ich an myFunc o1 (ist ja Pointer auf ObjA) und das sollte dann o2 zugewisen werden. }Der compiler beschwert sich nun, dass es keine Funktion gäbe, auf die der Aufruf
myFunc(ObjA*&)passt. Aber das mache ich doch auch nicht. Ich übergebe ja nicht ObjA& sondern eben nur ObjA*. Und das passt zur signatur von myFunc. Und wenn ich den Umweg über den Pointer nicht mache, sondern direkt
myFunc(&(myObjVector->at(0)));dann geht es ja auch...Übergibt C++ pointer vllt grundsätzlich als Referenz und hängt darum das & dran?
Wer weiß rat?

-
main sollte int zurückgeben, nicht void.
Versuch es mal in das hier zu ändernObjB& myFunc(ObjA& o)ObjA* o1 = myObjVector->at(0);
-
Das sollte eigentlich richtig sein. Wenn ich deinen (unvollständigen) Code zu etwas compilierbarem ergänze, funktioniert es auch:
class ObjB{}; class ObjA{}; ObjB *globalObjBPointer; // Bloß zum Testen ObjA globalObjA; ObjB * myFunc(ObjA * o) { return globalObjBPointer; } void function() { ObjA * o1 = &(globalObjA); ObjB * o2 = myFunc(o1); }Kannst du bitte ein minimales Beispiel bringen, dass den Fehler reproduziert? Und die genaue Fehlermeldung?
-
void function main() {was ist denn "function"?
-
Mr X schrieb:
void function main() {was ist denn "function"?
evtl ein
#define functionvllt hats ihm so besser gefallen

-
Hm, ok, also erstmal danke soweit.
Was ist denn function?
void function main() {Wollte die funktion erst function1 nennen...hab mich dann spontan umentschieden.

Ok, ich glaube mein Beispiel ist irgendwie schlecht. Hier einfach mal den Code:
MTAPFTau * pk01Analysis::bestMatch(MTAGenTau * gt, MTAPFTaus * pftaus, std::set<unsigned int> * blacklist, double threshold) { double phi1 = gt->p4.phi(); double eta1 = gt->p4.eta(); double dPhi; double dEta; double tmp; double min = -1; int id2use = -1; threshold *= threshold; for (unsigned int i = 0; i < pftaus->size(); i++) { dPhi = phi1 - (pftaus->at(i)).p4.phi(); dEta = eta1 - (pftaus->at(i)).p4.eta(); tmp = dPhi * dPhi + dEta * dEta; if ( (tmp < min) && (tmp < threshold) && (blacklist->find(i) == blacklist->end()) ) { // ok, this one is closer to threshold. min = tmp; id2use = i; } } if (id2use >= 0) { blacklist->insert(id2use); return &(pftaus->at(id2use)); } else { return NULL; } } void pk01Analysis::processEvent(MTAPFTaus * pftaus, MTAGenTaus * gentaus) { if (debug) std::cout << "processEvent\n"; // We should exit, if we do not have 2 GenTaus, and less than 2 Reco Taus if ( (pftaus->size() < 2) || (gentaus->size() != 2) ) { if (debug) std::cout << "Dropping Event: Not enough GEN/RECO taus or tau count does not match [" << gentaus->size() << "/" << pftaus->size() << "].\n"; } else { MTAGenTau* gt1 = &(gentaus->at(0)); MTAGenTau* gt2 = &(gentaus->at(1)); std::set<unsigned int> blacklist; MTAPFTau* rt1; // = bestMatch(gt1, pftaus, blacklist); MTAPFTau* rt2; // = bestMatch(gt1, pftaus, blacklist); rt1 = bestMatch(gt1, pftaus, blacklist, 2.0); // Hier gibts den Fehler!! if ( rt1 && rt2 ) { // rt[1,2] = best Reco Taus matching the GEN Taus // we can do some magic here... } else { if (debug) std::cout << "Dropping Event: Can not match two jets with GENTaus.\n"; } } if (debug) std::cout << "end of processEvent\n"; }Die genaue Fehlermeldung:
g++ -O3 -fPIC -DPIC -ansi -Wall -Woverloaded-virtual -Wno-non-virtual-dtor -D_GNU_SOURCE -pthread -m32 -I/wlcg/sw/cms/slc4_ia32_gcc345/lcg/root/5.22.00d-cms4/include -I /storage/6/krauss/CMSSW_3_3_6/src/ -I /wlcg/sw/cms/slc4_ia32_gcc345/cms/cmssw/CMSSW_3_3_6/src/ -I ../../ -c modules/pk01Analysis.cc -o modules/pk01Analysis.o modules/pk01Analysis.cc: In member function `void pk01Analysis::processEvent(MTAPFTaus*, MTAGenTaus*)': modules/pk01Analysis.cc:58: error: no matching function for call to `pk01Analysis::bestMatch(MTAGenTau*&, MTAPFTaus*&, std::set<unsigned int, std::less<unsigned int>, std::allocator<unsigned int> >&, double)' modules/pk01Analysis.cc:10: note: candidates are: MTAPFTau* pk01Analysis::bestMatch(MTAGenTau*, MTAPFTaus*, std::set<unsigned int, std::less<unsigned int>, std::allocator<unsigned int> >*, double) modules/pk01Analysis.cc:52: warning: unused variable 'gt2' make: *** [modules/pk01Analysis.o] Error 1
-
Was ist MTAGenTaus?
Was liefert MTAGenTaus::at()?
-
MTAGenTaus ist einfach ein std::vector<MTAGenTau>
->at() liefert also einen MTAGenTau (soweit ich das verstehe). Oder liefert es etwas nur einen Pointer? oO?#ifndef MTAGenTau_h #define MTAGenTau_h #include "MTALorentzVector.h" #include "MTALepton.h" class MTAGenTau : public MTALepton { public: MTAGenTau() : MTALepton(15), decayMode(0) {}; MTAGenTau(MTAXYZELorentzVector temp_vec) : MTALepton(temp_vec,15) {}; MTALorentzVector p4_vis; // momenta of visible particles int status; unsigned int decayMode; // 0 - undefined // 1 - electron // 2 - muon // >2 - hadronic // most significant bit (1<<15): // 0 = tau // 1 = descendant of a tau }; typedef std::vector<MTAGenTau> MTAGenTaus; #endif
-
Dein Fehler ist ganz einfach:
Deine Funktion erwartet blacklist als Pointer, du übergibst sie aber direkt.
-
SeppJ schrieb:
Dein Fehler ist ganz einfach:
Deine Funktion erwartet blacklist als Pointer, du übergibst sie aber direkt.OMG, du hast recht! Klar....Mensch und ich suche mich hier stundenlang zu Tode.
Viele, vielen Dank
(Topic kann geschlossen werden ^^)