1
4

1 に答える 1

2

この質問を投稿する前に、私は実際に問題を理解することができたので、他の人が将来役立つと思うかもしれないので、答えを出すのが賢明だと思われました. 「コミュニティwiki」への回答も設定したので、他の人が望むならそれを改善することができます.

test::問題は、フレンド関数がクラスのメンバーではないことです。したがって、フレンド関数は のメンバーではないため、指定子なしでコーディングする必要がありますclass test

ただし、宣言friend void friendly_function();はテスト クラス内にある必要があります。これは、friendly_function()のプライベート メンバーへのアクセスが許可されていることをコンパイラに通知するためですtest

friendly_function()は のメンバーではないため、このclass testコードをすべて名前空間にまとめて、すべての関数とクラスを 1 つの論理ブロック内にグループ化することをお勧めします。

namespace test_ns {
    class test
    {
    public:
        friend void friendly_function(test &_t);
        friend bool operator<(const test& _lhs, const test& _rhs);
    private:
        int data;
    }; // class test

    void friendly_function(test &_t)
    {
        _t.data = 0;
    }

    bool operator<(const test& _lhs, const test& _rhs)
    {
        return _lhs.data < _rhs.data;
    }

} // namespace test_ns

これで問題は解決するはずです。フレンド関数は、メンバー関数のように見えるかもしれませんが、実際にはそうではありません!

于 2013-08-29T20:43:47.080 に答える