4

次のコードでは、フレンド関数でクラスのプライベート メンバーにアクセスしようとしています。私の理解では、それをフレンド関数として正しく宣言していますが、VS2012 でエラーが発生しています。

error C2248: 'X::S::s_' : cannot access private member declared in class 'X::S'

誰かが私が間違っていることを提案できますか? これは、私が思いついたコンパイラ エラーを示す最も単純な例です。

namespace X
{
    class S
    {
        friend std::string r(X::S &s);
        std::unique_ptr<std::istream> s_;
    };
}
std::string r(X::S &s)
{
    auto& x = s.s_;
    return "";
}
4

2 に答える 2

7

::rではなく、を定義しX::rています。これは、友人の宣言の目的です。関数をクラスと一緒に名前空間に移動するか、クラス内で定義しますが、クラス テンプレートやクラス定義を簡潔に保つことで問題が発生する可能性があります。定義が別のファイルにある場合でも、クラスを名前空間に追加するように、名前空間で囲むことができます。X::また、資格はすでに にあるため、資格を削除することをお勧めしXます。

namespace X
{
    class S
    {
        friend std::string r(S &s);
        std::unique_ptr<std::istream> s_;
    };

    std::string r(S &s)
    {
        auto& x = s.s_;
        return "";
    }
}
于 2013-07-24T03:52:01.340 に答える
6

グローバルが必要な場合r

namespace X
{
    class S;
}

std::string r(X::S &s);

namespace X
{
    class S
    {
        friend std::string (::r)(X::S &s);
        std::unique_ptr<std::istream> s_;
    };
}

std::string r(X::S &s)
{
    auto& x = s.s_;
    return "";
}
于 2013-07-24T04:00:12.953 に答える