2013-07-30 9 views
9

Ich habe eine Klasse wie folgt aus:Freund-Funktion aus einer Templat-Klasse

#include "Blarg.h" 
// ... 

class Foo : public Bar {  
    // ... 
    static double m_value; 
    // ...  
}; 

Und ein anderes wie folgt aus:

template<class X, class Y> 
class Blarg : public Bar { 
    // ... 
    void SetValue(double _val) { Foo::m_value = _val; } 
    // ... 
}; 

Seit Foo ‚s m_value privat ist (und ich möchte halten Auf diese Weise dachte ich, ich würde die SetValue Funktion als Freund der Klasse Foo deklarieren, damit sie bei Bedarf auf das statische Element zugreifen kann.

Ich habe versucht, Erklärungen in dieser Richtung innerhalb Foo ‚s öffentlichen Bereich:

template<class X, class Y> friend void Blarg<X, Y>::SetValue(double _val); 

template<class X, class Y> friend void Blarg::SetValue(double _val); 

friend void Blarg::SetValue(double _val); 

... aber kein Glück bei der Zusammenstellung. Was ist die richtige Syntax dafür, wenn möglich?

+0

Welchen Fehler bekommen Sie mit dem ersten? – Praetorian

+1

"kein Glück beim Kompilieren" ist keine technische Beschreibung des aufgetretenen Fehlers. –

+0

Sie müssen nach jeder Klassendefinition ein '' 'schreiben. –

Antwort

7

Sie haben Blarg Klasse vor Foo Klasse definieren, um eine der Blarg ‚s Methode als friend zu markieren. Sind Sie sicher, dass die Blarg definiert ist (oder enthalten) vor Foo Deklaration mit einer Freundeslinie?

+2

Das und fix die Typen der Memberfunktion (Rückgabetyp fehlt). +1 –

+0

^Ups! Danke, dass du das erwischt hast! – nicole

0

Hier ist die korrekte Syntax:

template<class T> 
class Bla 
{ 
public: 
    void toto(double val); 
};  

class Foo { 
    static double m_value; 
    template<typename T> 
    friend void Bla<T>::toto (double); 
} ; 

Stellen Sie außerdem sicher, dass Bla vor Foo definiert ist.

3

Dies scheint für mich zu arbeiten:

template<class X, class Y> 
class Blarg : public Bar { 
    public: 
     void SetValue(double _val); 
}; 

class Foo : public Bar { 
    private: 
     static double m_value; 

    public: 
     template<class X, class Y> friend void Blarg<X,Y>::SetValue(double _val); 
}; 

template <class X, class Y> 
void Blarg<X,Y>::SetValue(double _val) 
{ 
    Foo::m_value = _val; 
} 

ich durch die Definition Blarg zuerst die zirkuläre Abhängigkeit zu brechen hatte und machen SetValue inline nicht. Ihre Freundesdeklaration war ziemlich korrekt, bis auf den fehlenden Rückgabewert.