template-Funktion als friend-function einer Template Klasse ?



  • Hallo Leute,

    ich kämpfe gerade mal wieder mit Templates.
    Was läuft hier falsch:

    template <typename T>
    class A : public B<T> {
    
     public:
    /*
    blablabla
    */
      private:
    
        friend T readFunc<T>(void *);
    
        friend void writeFunc<T>(T data, void*);
    };
    
    template <typename T>
    T readFunc(void* inRefCon)
    {
        A<T>* pA = static_cast<A<T>*>(inRefCon);
        return pA->data();
    }
    
    template <typename T>
    void writeFunc(T data, void* inRefCon)
    {
        A<T>* pA = static_cast<A<T>*>(inRefCon);
        pA->set(data);
    }
    

    Wie unschwer zu erkennen ist, muss die readFunc bzw writeFunc vom Datentyp her zur Klasse A passen.

    Der Kompiler moniert mir:

    error: ‘readFunc’ is neither function nor member function; cannot be declared friend
    error: expected ‘;’ before ‘<’ token
    

    bevor jetzt die Unkenrufe kommen "mach doch ne Memberfunktion draus", geht nicht, die Funktionen müssen als Funktionspointer in eine C-API, daher nix mit memberfunktion.

    Danke und ein frohes neues Jahr an Alle!



  • Hallo,
    sind die beiden Funktionen denn irgendwie zum Punkt der friend-Deklaration bekannt?

    template <typename T>
    T readFunc(void* inRefCon)
    {
        A<T>* pA = static_cast<A<T>*>(inRefCon);
        return pA->data();
    }
    
    template <typename T>
    void writeFunc(T data, void* inRefCon)
    {
        A<T>* pA = static_cast<A<T>*>(inRefCon);
        pA->set(data);
    }
    
    template<typename T>
    class B
    {
    };
    
    template <typename T>
    class A: public B<T>
    {
    public:
    
    private:
      friend T readFunc<T>(void *);
      friend void writeFunc<T>(T data, void*);
    
      void set(T const& data);
      T const& data();
    };
    
    int main()
    {
      A<int> a;
      writeFunc<int>(1, &a);
      readFunc<int>(&a);
    }
    

    Kompiliert bei mir anstandslos (gcc).



  • guuuuuter Input!

    Habe jetzt zwei deklarationen (nicht definitionen) oberhalb der Klasse eingefügt (und die Definitionen unten gelassen wie sie sind).

    Kompiliert!
    Danke!


Anmelden zum Antworten