13

次のように、名前空間の外側でクラス フレンド関数を定義しようとしています。

namespace A{
class window{
    private:
    int a;
    friend void f(window);
};
}

 void f(A::window rhs){
 cout << rhs.a << endl;
}

あいまいさがあるというエラーが表示されます。と の 2 つの候補がvoid A::f(A::window);ありvoid f(A::window)ます。だから私の質問は:

1) グローバル関数void f(A::window rhs)をクラス A::window のフレンドにする方法。

編集:(回答を読んだ後)

2) ウィンドウ クラス内のメンバー関数 f をグローバルに修飾する必要があるのはなぜ::f(window)ですか?

3) この特定のケースで関数 f(A::window) を事前に宣言する必要があるのはなぜですか。一方、クラスが名前空間内で定義されていない場合、関数がフレンドとして宣言された後に関数を宣言しても問題ありません。

4

3 に答える 3

24

a を追加するだけでなく、::それを前方宣言する必要があります。

namespace A { class window; }

void f(A::window);

namespace A{
  class window{
    private:
    int a;
    friend void ::f(window);
  };
}

void f(A::window rhs){
  std::cout << rhs.a << std::endl;
}

この前方宣言が機能するには、クラスも前方宣言する必要があることに注意してください。

于 2012-06-07T15:00:29.423 に答える
5

これはそれを行う必要があります: f がグローバル名前空間にあることを明確にするために前方宣言が必要です (静的ファイルではありません):

#include <string>
#include <iostream>

using namespace std;

////// forward declare magic:

namespace A{ class window; }    
void f(A::window rhs);

//////

namespace A {
    class window {
        private:
            int a;
            friend void ::f(window);
    };
}

void f(A::window rhs) {
    cout << rhs.a << endl;
}

int main()
{
}
于 2012-06-07T15:03:47.113 に答える