0

名前空間内にクラスを作成しましたが、名前空間を使用または呼び出す必要があるときに問題が発生します。コンパイラ エラーの考えられる理由は何ですか??

namespace name1    
{   
        class show   
    {   
        int a,b;   
        void accept_data(void);   
        void display_data(void);   
        friend void use_class(void);  
    };  
}

コンパイラ エラー -

test1.cpp: 関数 'void use_class()':
test1.cpp:17:6: エラー: 'void name1::show::accept_data()' は非公開
です test1.cpp:31:16: エラー: このコンテキスト内
test1.cpp:24:6: エラー: 'void name1::show::display_data()' は非公開
です test1.cpp:32:17: エラー: このコンテキスト内

4

2 に答える 2

3

修飾されていない識別子 ( など) を使用してフレンド関数を宣言するとuse_class、その宣言は常に、宣言が表示されるクラスの最も近い外側の名前空間のメンバーを指定します。関数の以前の宣言は、可視である必要はありません。void ::name1::use_class()これは、宣言が関数をクラスのフレンドとして宣言することを意味します::name1::show

別の名前空間からフレンドを宣言する場合は、修飾された ID を使用する必要があります。

例えば

friend void ::use_class();

修飾されていない場合とは異なり、フレンドシップされる関数の以前の宣言が可視でなければならないことに注意してください。例えば

void use_class();
namespace name1 {
    class show {
    //...
    friend void ::use_class();
    //...
    };
}
于 2012-02-04T15:55:19.120 に答える
0

あなたはこれを持つことができます:

namespace name1    
{   
        class show   
    {   
        int a,b;   
        void accept_data(void);   
        void display_data(void);   
        friend void use_class(show&);  
    };  
}

void name1::use_class(name1::show& h)
{
h.a = 1;
h.b = 2;
}

そして主に:

name1::show s;

name1::use_class(s);

ただし、関数に無効なパラメーターと戻り値がある理由はわかりません。

アップデート:

これはコンパイルして動作します:

#include "stdafx.h"

namespace name1    
{   
        class show   
    {   
        int a,b;   
        void accept_data(void);   
        void display_data(void);   
        friend void use_class();  
    };  
}

void name1::show::accept_data()
{
    a = 1;
    b = 2;
}

void name1::show::display_data()
{
}

void name1::use_class()
{
    show s;

    s.accept_data();
    s.display_data();
}

int _tmain(int argc, _TCHAR* argv[])
{
    name1::use_class();

    return 0;
}

しかし、私がそれを次のように書くと:

void use_class()
{
    name1::show s;

    s.accept_data();
    s.display_data();
}

私はあなたのエラーを取得します。あなたuse_classが同じ名前空間の一部であることを確認してください。

于 2012-02-04T15:32:03.207 に答える