template Funktion in einer Klasse



  • Hi

    Ich brauchte in einer ganz normalen Klasse eine Template Funktion. Allerdings weiß ich nicht wie man sie definiert. Er bringt rätzelhafte fehler. Ich hoffe das Visual C++ 6 auf dem ich arbeite diese Funktion überhaupt unterstützt.

    Wie kann ich so eine Template Funktion definierten???



  • Uh, ich glaub das geht so ohne weiteres nicht.



  • Uh, ich glaub das geht so ohne weiteres nicht.

    Sicher geht das. Und selbst der VC 6 unterstützt diese sogenannten Member-Templaes. Allerdings erlaubt der VC 6 deren Definition *ausschließlich* innerhalb der Klassndefinition:

    class Foo
    {
    public:
        template <class T>
        void bar(T p)
        {...}
    };
    ...
    Foo f;
    f.bar(22);  // Foo::Bar<int>
    f.bar(2.2); // Foo::Bar<double>
    f.bar('a'); // Foo::Bar<char>
    


  • Echt???

    Das wäre ziemlich blöd. Gibt es denn keine Möglichkeit. Habe ein Buch wo etwas darüber steht. Steht aber das es nciht von jeden Compiler unterstützt wird. Naja muss ich alles umschreiben



  • Original erstellt von HumeSikkins:
    Allerdings erlaubt der VC 6 deren Definition *ausschließlich* innerhalb der Klassndefinition:

    Gut zu wissen. Ich hab die dann immer unter der Klassendefinition hingeschrieben und mich gewundert, warum es nicht geht. THX 😉



  • Und wie ist es wenn man eine Template Funktion hat (in einer Klasse) und man gibt T zurück. z.B.

    templat<class T> T MyClass::func();

    Kann ich da auch wenn ich die Funktion aufrufe T festlegen. z.B. (geht nicht so)

    MyClass a;
    a.func<int>();
    a.fung<double>();

    gibt es so etwas in der art?



  • templatefunktion(T &t);
    templatefunktion(T *t);

    ^so wärs auch zu realisieren.

    Devil



  • Original erstellt von ohama:
    **Kann ich da auch wenn ich die Funktion aufrufe T festlegen. z.B. (geht nicht so)

    MyClass a;
    a.func<int>();
    a.fung<double>();

    gibt es so etwas in der art?**

    jo, so gehts. nur der vc++ checkt das nicht. workaround:

    templat<class T> T MyClass::func(T* dummy=0);

    und schon kann ers 🙂



  • und schon kann ers

    Nein leider nicht ganz. Richtig ist, dass dieser Workaround bei Template-*Funktionen* ausreicht. Der VC versteht allerdings die Syntax der expliziten Template-Argument-Angabe nur bei Template-*Funktionen*, nicht bei Template-Memberfunktionen.

    Ein:
    obj.func<int>();

    kann er nicht übersetzen.

    Hier hilft sowas wie:

    #define ETAS(t) (t*) 0
    
    class Foo
    {
    public:
        template <class T>
        T bar(T*)
        {...}
    };
    
    ...
    Foo f;
    f.bar((int*)0);        // Foo::bar<int>
    f.bar(ETAS(double));   // Foo::bar<double>
    


  • Original erstellt von HumeSikkins:
    **Der VC versteht allerdings die Syntax der expliziten Template-Argument-Angabe nur bei Template-*Funktionen*, nicht bei Template-Memberfunktionen.
    **

    ups - das wusste ich nicht...

    danke fuer die richtig stellung!


Anmelden zum Antworten