Template Methoden mit Default Value



  • Moin, moin,

    ich möchte bei einer Methode, die einen template Parameter hat, diesen Parameter mit einem Defalut-Wert versehen:

    class Component {
      public:
        template <typename T>
        void
        myMethode(int i, T t = Component::defaultT) {
          ..
        }
    
        static TDefaultT defaultT;
    }
    

    Der Compiler findet aber beim Aufruf die Methode mit nur einem Argument nicht:

    Component c;
    c.myMethode(0);
    

    Wenn ich den Defaultvalue direkt zuweise kompiliert es problemlos

    Component c;
    c.myMethode(0, Component::defaultT);
    

    Auch wenn ich das template auflöse funktioniert es problemlos:

    class Component {
      public:
        void
        myMethode(int i, TDefaultT t = Component::defaultT) {
          ..
        }
    
        static TDefaultT defaultT;
    }
    

    Der Compiler sollte doch eigentlich wenn kein Parameter angegeben ist den Default-Wert einsetzen und damit ist ihm doch der Typ für das Template bekannt?
    Ist das was ich vorhabe grundsätzlich Möglich und ich hab nur irgendwo ein Typo drin den ich einfach nicht sehe oder kann man template Parametern keine default Werte zuweisen und ich muss das anders machen?

    cu
    thundernail



  • Woher weiß denn der Compiler bei weglassen des 2. Parameter was er für T einsetzen soll ?



  • Knuddlbaer schrieb:

    Woher weiß denn der Compiler bei weglassen des 2. Parameter was er für T einsetzen soll ?

    Methodenaufruff:

    c.myMethode(0);
    

    nach auffüllen der fehlenden Parameter mit default Werten:

    c.myMethode(0, Component::defaultT);
    

    Und dann ist dem Comliper doch bekannt, für welchen Typ er die Methode bauen muss.



  • template <class T>
    void fn(int x,T y = 12)
    {
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    
    	// fn(12); Typ kann nicht hergeleitet werden
    	fn<int>(12);
    	return 0;
    }
    

    Irgendwas unbekanntes soll Component::defaultT übernehmen. Aber daraus kann man doch den Typ nicht ableiten 😕



  • Hmm, der Compiler erkennt doch im Normalfall auch, dass deine 12 ein Integer ist, warum kann er dann nicht für T int einsetzen.

    Ok, aber da es so wie ich mir vorgestellt habe anscheinend nicht funktioniert, hab ich mir jetzt einen Wrapper geschrieben:

    void
        myMethode(int i) {
          TDefaultT defaultT;
          this->myMethode(i, defaultT);
        }
    

    Nicht perfekt aber es funtioniert 😉

    Danke für die Hilfe.



  • Na 12 kann auch sein:

    chat short long double float - was soll der compiler denn einsetzen ? 🤡


Anmelden zum Antworten