2013-07-30 20 views
9

Mam klasy jak poniżej:Funkcja Friend z matrycy klasy

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

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

a drugi tak:

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

Rejestracja Foo „s m_value jest prywatny (i chciałbym, aby utrzymać w ten sposób), myślałem, że zadeklaruję funkcję SetValue jako przyjaciela klasy Foo, aby mógł uzyskać dostęp do statycznego elementu, gdy jest potrzebny.

Próbowałem deklaracji wzdłuż tych linii w całym obszarze publicznym Foo „s:

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); 

... ale nie ma szczęścia w kompilacji. Jaka jest właściwa składnia tego, jeśli to możliwe?

+0

Jaki błąd występuje w przypadku pierwszego? – Praetorian

+1

"nie ma szczęścia w kompilacji" nie jest technicznym opisem błędu, z którym się spotkałeś. –

+0

Musisz napisać ';' po każdej definicji klasy. –

Odpowiedz

7

Trzeba zdefiniować Blarg klasa zanim Foo klasę, aby zaznaczyć jedną z metod Blarg „s jako friend. Czy na pewno Blarg jest zdefiniowany (lub dołączony) przed deklaracją Foo z linią znajomych?

+2

To i naprawić typy funkcji członka (brakuje typu zwrotu). +1 –

+0

^Ups! Dzięki za złapanie tego! – nicole

0

Oto poprawna składnia:

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); 
} ; 

Ponadto, upewnij się, że Bla jest zdefiniowana przed Foo.

3

To wydaje się działać dla mnie:

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; 
} 

musiałem przełamać zależność cykliczna definiując Blarg pierwszy i podejmowania setValue nie inline. Deklaracja przyjaciela była prawie poprawna, z wyjątkiem brakującej wartości zwracanej.

Powiązane problemy