2013-07-30 9 views
9

Böyle bir sınıf var bu şekilde), ben gerektiğinde statik üyesine erişmek diye ben Foo sınıfına arkadaş olarak SetValue fonksiyonunu ilan edeceğini düşündük.Arkadaş fonksiyonu

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

... ama derleme hiçbir şanslar:

Ben Foo 'ın kamu alanı içinde bu satırlar boyunca beyanlarını denedim. Mümkünse bunun için uygun sözdizimi nedir?

+0

İlkinde ne gibi bir hata var? – Praetorian

+1

"Derlemede şans yok", karşılaştığınız hataların teknik bir açıklaması değildir. –

+0

Her sınıf tanımından sonra ';' yazmanız gerekir. –

cevap

7

Bir friend olarak Blarg 'ın yöntemin birini işaretlemek için Blarg sınıf Foo önce sınıfını tanımlamak zorunda. Blarg'un bir arkadaş hattında Foo bildirgesinden önce tanımlandığından (veya dahil edildiğinden) emin misiniz?

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

Ayrıca BlaFoo önce tanımlandığından emin olun:

+2

Üye işlevinin türlerini (dönüş tipi eksik) düzeltin ve düzeltin. +1 –

+0

^Oops! Onu yakaladığın için teşekkürler! – nicole

0

İşte doğru sözdizimi.

3

Bu benim için iş gibi görünüyor:

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

Ben ilk blarg tanımlayan ve inline SetValue değil yaparak döngüsel bağımlılığı kırmak zorunda kaldı. Eksik beyan değeri haricinde arkadaş beyannameniz oldukça doğruydu.