如何在命名空间内写入类时如何使用friend函数

时间:2012-02-04 15:21:32

标签: c++ namespaces friend-function

我在命名空间内创建了一个类,现在当我必须使用或调用命名空间时会出现问题,编译错误的可能原因是什么?

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:错误:在此上下文中

2 个答案:

答案 0 :(得分:3)

使用非限定标识符(如use_class)声明友元函数时,该声明始终指定声明出现的类的最近的封闭命名空间的成员。之前的函数声明不一定是可见的。这意味着您的声明声明函数void ::name1::use_class()是该类::name1::show的朋友。

如果要从其他名称空间声明朋友,则必须使用限定ID。

E.g。

friend void ::use_class();

请注意,与不合格的情况不同,必须显示以前声明的函数。 e.g。

void use_class();
namespace name1 {
    class show {
    //...
    friend void ::use_class();
    //...
    };
}

答案 1 :(得分: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);

我不确定为什么你的函数有void参数并返回值。

更新:

这编译并运作:

#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属于同一命名空间。