Default Wert für Klassentypen.



  • Hallo, vielleicht ist das ne extrem blöde frage, hab auf jeden fall per suche nichts gefunden.
    ist es möglich sowas zu machen:

    bool methodenName( parameter..,  bool line = false , ... (parameterMitDefault),  map<int ,TF1*> fits = leereMap  );
    

    geht das? und wenn ja was muss dann da anstelle leereMap stehen ?


  • Mod

    M10n schrieb:

    geht das? und wenn ja was muss dann da anstelle leereMap stehen ?

    map<int ,TF1*>()



  • Also, die Funktionsdeklaration wie du sie jetzt zeigst ist Irrsinn. Nein, nein, das geht nicht.

    Was willst du erreichen? Siehe nochmal den Punkt 9 hier an.

    Siehe dir auch variadic-templates an, das könnte mitunter eine Lösung für dein "variable Anzahl an Funktionsparametern" sein.

    Btw: statt leereMap müsste da entweder der Identifier einer anderen Map gleichen Typs sein (also gleiche Template-ID!), oder einfach map<int ,TF1*>() .



  • Ach, stop! Du willst überhaupt keine variable Parameterzahl, sondern du hast einfach abgekürzt! 💡 😃

    Ich dachte, das sollen irgendwie ellipsis für eine variadic-function aus C sein.



  • SeppJ schrieb:

    M10n schrieb:

    geht das? und wenn ja was muss dann da anstelle leereMap stehen ?

    map<int ,TF1*>()

    Das war mein naiver ansatz der nicht funktioniert hat.
    die ganze deklaration sieht so aus:

    bool drawInto(string , string , bool split = false,  bool with_errors= false , bool line = false , map<int,TF1*> fits =  map<int,TF1*>());
    

    fehler sind:
    `

    /Users/../drawer1d.h:43: error: expected ',' or '...' before '>' token

    /Users/../drawer1d.h:43: error: wrong number of template arguments (1, should be 4)

    /usr/include/c++/4.2.1/bits/stl_map.h:93: error: provided for 'template<class _Key, class _Tp, class _Compare, class _Alloc> class std::map'

    /Users/../drawer1d.h:43: error: default argument missing for parameter 7 of 'bool Drawer1D::drawInto(std::string, std::string, bool, bool, bool, std::map<int, TF1*, std::less<int>, std::allocator<std::pair<const int, TF1*> > >, TF1*)'

    `
    und warum denn bitte parameter 7. sind doch nur 6.



  • Zeig mal bitte vollständigen Code, um das Problem nachzuvollziehen (siehe Link in meiner Signatur). Ich rate mal: hast du TF1 vorher deklariert? Wenn der Compiler incht weiß, was das sein soll, kommt er ggf. völlig aus dem Tritt und brabbelt nurnoch Mist...
    Mal davon abgesehen dass eine Funktion mit 6 Parametern auf ein Designproblem schließen lässt. Sind die wirklich alle nötig?



  • also der header sieht so aus:

    #ifndef DRAWER1D_H_
    #define DRAWER1D_H_
    
    #include <vector>
    #include <string>
    #include <TF1.h>
    #include <map>
    
    struct labeling {
    	std::string caption;
    	std::string x_axis;
    	std::string y_axis;
    };
    
    using std::string;
    using std::vector;
    using std::map;
    class Drawer1D {
    
    	std::vector<double> basis ;
    	std::vector< std::vector<double> > data;
    	std::vector< std::vector<double> > y_errors1;
    	std::vector< std::vector<double> > y_errors2;
    	std::vector< std::vector<double> > x_errors1;
    
    	std::vector<labeling> names;
    public:
    	~Drawer1D();
    	Drawer1D(int);
    ...
    	bool draw(string , string , map<int,TF1 *> , vector<TF1 *>);
    
    	bool drawInto(string , string , bool split = false,  bool with_errors= false , bool line = false , map<int,TF1 *> fits =  map<int,TF1 *>());
    
    	void setNames(std::vector<labeling>);
    ...
    #endif /* DRAWER1D_H_ */
    

    das ganze soll das plotten mit root (root.cern.ch) für meine zwecke einfacher machen.

    pumuckl schrieb:

    Ich rate mal: hast du TF1 vorher deklariert? Wenn der Compiler incht weiß, was das sein soll, kommt er ggf. völlig aus dem Tritt und brabbelt nurnoch Mist...
    Mal davon abgesehen dass eine Funktion mit 6 Parametern auf ein Designproblem schließen lässt. Sind die wirklich alle nötig?

    also die normale draw-funktion hat bisher funktioniert. muss mit TF1 mehr als include passieren wenn ich es in map<int,TF1 *> fits = map<int,TF1 *>() verwende?
    jaa, 6 parameter sind vll. etwas viel, mir fällt aber auch nicht ein wie ich das was ich will schöner haben kann.

    die funktion in der cpp(ich weiss nicht ob das irgendwas hilft ausser dass manchen vll. etwas schlecht wird, aber gerade muss es nur so schnell es geht laufen) sieht so aus:

    bool Drawer1D::drawInto(std::string rootfile , std::string name , bool split , bool with_errors , bool line , map<int ,TF1*> fits  ) {
    
    	const char * draw_options = "AP";
    	if(line) draw_options = "AL";
    
    	TFile  f((rootfile + ".root").c_str() , "UPDATE" );
    
    	TCanvas *  canvas = new TCanvas(name.c_str());
    
    		if(split) {
    
    			int y_size  = (int) data.size()/2 + data.size()%2;
    			int x_size  =  2;
    			canvas->Divide(x_size,y_size);
    
    		}
    
    		TMultiGraph * multiG = new TMultiGraph();
    
    		vector<TGraph * > graphs ;
    
    		vector<vector<double> >::iterator dataset;
    
    		unsigned graph_num = 0;
    		for (dataset = data.begin(); dataset != data.end(); ++dataset) {
    
    			if(with_errors) {
    				graphs.push_back(new TGraphErrors( basis.size() ));
    				std::cout << basis.size() << std::endl;
    			} else {
    				graphs.push_back(new TGraph( basis.size() ));
    			}
    
    			for (unsigned int i = 0; i < basis.size(); ++i) {
    //				(graphs.back())->SetPoint(graphs.back()->GetN() , basis[i],(*dataset)[i] );
    				(graphs.back())->SetPoint(i , basis[i],(*dataset)[i] );
    
    			}
    
    			if(with_errors) {
    				std::cout << graphs.back()->GetN() << std::endl;
    				for (unsigned int i = 0; i < basis.size(); ++i) {
    //					static_cast<TGraphErrors*>(graphs.back())->SetPointError( 2*i , 0 ,y_errors1[graph_num][i] );
    					static_cast<TGraphErrors*>(graphs.back())->SetPointError( i , 0 ,y_errors1[graph_num][i] );
    				}
    			}
    
    			int color_code = (graph_num+1 == 10)? graph_num+2 : graph_num+1; // 10 is white....
    			(graphs.back())->SetMarkerColor(color_code);
    			(graphs.back())->SetMarkerStyle(6);
    			(graphs.back())->SetLineColor(color_code);
    			if(names.size() > graph_num) {
    				graphs.back()->SetTitle(names[graph_num].caption.c_str());
    			}
    
    			if(fits.find(graph_num) != fits.end()) {
    				double min, max;
    				fits.find(graph_num)->second->GetRange(min, max);
    				graphs.back()->Fit(fits.find(graph_num)->second , "" , " ", min , max);
    			}
    
    			if(!split){
    				multiG->Add(graphs.back());
    			} else {
    				canvas->cd(graph_num+1);
    			graphs.back()->DrawClone(draw_options);
    
    			}
    			graph_num++;
    
    		}
    
    		if(!split){
    			canvas->cd();
    			multiG->Draw(draw_options);
    		}
    
    	canvas->Write((name).c_str());
    
    	return true;
    }
    


  • hat niemand eine idee?



  • Bug in gcc<4.4?

    So wie ich das sehe kannst Du das default Argument extra klammern, oder aus drawInto zwei überladene Fkt. machen - allerdings ist das schlecht wg. der default-Argumente vor "fits".



  • 👍 Woohoo,das wars, dank dir!


Anmelden zum Antworten