template klassenobjekt



  • hallo

    mein code:

    struct foo
    {
        template<class T>
        void operator()(T a){}
    };
    int main()
    {
        foo(5);
    }
    

    ideone.com/biMgip

    es gibt beim kompilieren einen fehler. soweit ich das beurteilen kann, versucht der kompiler eine instanz zu erzeugen und beschwert sich darüber, dass ich einen parameter angebe, den er nicht braucht. ich will aber ein funktionsobjekt haben, so dass ich die klasse als funktion behandeln kann. was muss ich ändern?



  • Was du da machst ist ein Konstruktoraufruf. Du willst aber den ()-Operator aufrufen, dafür braucsht du natürlich vorher ein Objekt (einen Funktor):

    struct foo
    {
        template<class T>
        void operator()(T a){}
    };
    int main()
    {
        foo f;
        f(5); // --> f<int>(5)
        return 0;
    }
    

  • Mod

    foo(5)
    

    erzeugt ein neues Objekt, und benötigt einen entsprechenden Konstruktor. Willst du den überladenen ()-Operator verwenden, muss schon ein Objekt existieren, auf dass dieser angewendet werden kann. Also z.B.

    foo()(5);
    


  • camper schrieb:

    foo()(5);
    

    Das sieht hart aus 😃 🕶



  • struct foo
    {
        template<class T>
        void operator()(T a){}
    };
    int main()
    {
        foo f;
        f(5);
    }
    


  • Wenn du ein Funktionsobjekt brauchst, dann erstelle bitte auch ein Objekt:

    foo myFoo;
    myFoo(5);
    


  • Deine Code benutzt einen undefinierten Konstruktor ( foo( int ) . Wenn du den operator() benutzen willst kann das so ausehen:

    struct foo
    {
       template<typename T>
       void operator()( T a ) {}
    };
    
    int main()
    {
       // 1. explizit Objekt erzeugen
       foo myFoo;
       myFoo( 5 );
    
       // temporary benutzen
       foo()( 5 );
    }
    


  • danke für die schnelle antwort.

    ich habe mich entschieden, diese syntax zu nutzen:

    foo()(5);
    


  • Brauchst Du die Klasse denn dann überhaupt? Es gibt auch Template-Funktionen.



  • Eisflamme schrieb:

    Brauchst Du die Klasse denn dann überhaupt? Es gibt auch Template-Funktionen.

    Besonders komisch ist die Tatsache: Ein operator() sollte schließlich mit den Membern der Klasse arbeiten, was hier (und möglicherweise im entsprechenden real-life Szenario des TE) nicht der Fall ist. Dann schon vielleicht allermindestens eine statische Memberfunktion.


Log in to reply