2013-07-30 92 views
9

我有這樣一個類:好友功能

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

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

而另外一個是這樣的:

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

由於Foom_value是私有的(我想保留這樣),我想我會宣佈SetValue函數作爲Foo類的一個朋友,以便它可以在需要時訪問靜態成員。

我已經試過聲明沿Foo的公共區域內的這些行:

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

...但在編制沒有運氣。如果可能的話,什麼是適當的語法?

+0

第一次遇到什麼錯誤? – Praetorian

+1

「編譯時運氣不好」並不是您遇到的錯誤的技術性描述。 –

+0

你需要在每個類定義之後寫一個';'。 –

回答

7

您必須在Foo類之前定義Blarg類,以便將Blarg的方法之一標記爲friend。確定Blarg是在Foo聲明與朋友之前定義(或包含)?

+2

這並修復成員函數的類型(返回類型丟失)。 +1 –

+0

^糟糕!感謝您的支持! – nicole

0

下面是正確的語法:

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

同時,確保BlaFoo之前定義。

3

這似乎爲我工作:

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

我必須首先定義Blarg和製作的SetValue沒有內嵌打破循環依賴。你的朋友聲明是非常正確的,除了缺少返回值。