2011-07-28 19 views
2

私はC++入門を読んでいると著者は言う、クラスは、名前空間内で定義されている場合は名前空間内にあるクラスのfriend関数の定義。

」は、その後、それ以外 宣言されていない友人 関数が同じ名前空間で宣言されています。

 namespace A { 
     class C { 
      public: 
      friend void f(const C&); // makes f a member of namespace A 
     }; 
     } 

それは私が名前空間内で再び)(関数fを宣言する必要はありませんという意味ではありません?

私は単純に関数fを定義するとき()名前空間aの外S

void 
A::f(const C& obj) 
{ 
    std::cout << "f(const C&) " << std::endl; 
} 

私はG ++ 4.5と言ってから、エラーを取得し、

FriendDeclarations1.cpp:40:23: error: ‘void A::f(const A::C&)’ should have been declared inside ‘A’ 

誰もが著者が何を意味するものではない私に教えていただけますか?

答えて

0

あなたはこのようになりますクラス宣言のために、クラスメンバの定義としてそこに解釈されているもの:

class A { 
    void f(const C& obj); 
} 

あなたはこのようfを定義する必要があります:

namespace A { 
    void f(const C& obj) 
    { 
    std::cout << "f(const C&) " << std::endl; 
    } 
} 
3

何著者手段をその名前空間が明示的に記述されていない場合、friend関数が同じクラス名前空間内で暗黙的に宣言されるということです。名前空間内で定義されたと

のでfニーズA

#include <iostream> 

namespace A { 
    class C { 
    friend void f(const C&); // makes f a member of namespace A 
    int i; 

    public: 
     C() : i(42) {} 
    }; 

    void f(const A::C& obj) 
    { 
    std::cout << "f(const A::C&) " << std::endl; 
    std::cout << "obj.i = " << obj.i << std::endl;  // access private member 
    } 
} 

int main() 
{ 
    A::C ac; 

    f(ac); 
    return 0; 
} 

あなたはf

#include <iostream> 

// forward declarations 
namespace A { class C; } 
namespace B { void f(const A::C&); } 

namespace A { 
    class C { 
    friend void B::f(const C&); 
    int i; 

    public: 
    C() : i(42) {} 
    }; 
} 

namespace B { 
    void f(const A::C& obj) 
    { 
    std::cout << "f(const A::C&) " << std::endl; 
    std::cout << "obj.i = " << obj.i << std::endl;  // access private member 
    } 
} 

int main() 
{ 
    A::C ac; 

    B::f(ac); 
    return 0; 
} 
2

標準7.3.1.2/3に属することを明示的に名前空間を示すことによって、この動作を変更することができます

名前空間で最初に宣言されたすべての名前は、その名前空間のメンバーです。 非ローカルクラスのフレンド宣言が最初にクラスまたはファンクションを宣言する場合83)フレンドクラスまたはファンクションは、ネームスペースを囲む最も内側の のメンバーです。 友人の名前は、その名前空間のスコープ内に(友人関係を与えるクラス宣言の前または後に)一致する宣言が提供されるまで、単純な名前検索によっては見つかりません。

関連する問題