2011-01-05 13 views
1

にインライン友人としての機能を宣言私はこのように宣言されたクラスを持っています。 この関数をインラインフレンドとネームスペースの外に宣言する方法はありますか?ここでは異なる名前空間

+0

'DoSomething()'は、 'A'型の引数を取っていないので、' A'の 'friend'を作る点は何ですか?不思議なんだけど! – Nawaz

+0

@Nawaz DoSomething()は、タイプAの静的オブジェクトを作成します。 –

答えて

3

は、ソリューションです:

namespace nsp1 
{ 
    class A; 
} 

inline void DoSomething(const nsp1::A & a); 
namespace nsp1 
{ 

class A 
{ 
    public : 
    inline friend void ::DoSomething(const nsp1::A & a); 

    private : 
    A(); 

    int a; 
}; 

} 

inline void DoSomething(const nsp1::A & a) 
{ 
    std::cout<<a.a<<std::endl;//a.a is private! 
} 
+0

doh forward宣言。完全に忘れました。ありがとう –

+0

DoSomething()が動作する可能性がある 'A'型の引数を取ってみてください。これを 'DoSomething(A&a)'関数で解くことを意味します。 – Nawaz

+0

@Nawazよくnsp1 :: Aは専用のコンストラクタを持っているので、DoSomethingだけがnsp1 :: Aオブジェクトを構築できます。だから私は関数DoSomethingを変更し、今はnsp1 :: Aのコンストラクタを呼び出しています。 – UmmaGumma

2

一度にそれを行うことはできません。最初に名前空間と関数を宣言してから、関数にふさわしいクラスを定義し、関数を定義する必要があります。

namespace nsp2 
{ 
    void DoSomething(); 
} 

namespace nsp1 
{ 
    class A 
    { 
    public : 
     friend void nsp2::DoSomething(); 

    private : 
     A(); 

     int a; 
    }; 
} 

namespace nsp2 
{ 
    inline void DoSomething() 
    { 
     nsp1::A a; 
     a.a = 42; 
    } 
} 
関連する問題