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: error: 'void name1::show::display_data()' is private
test1.cpp:32:17: error: 在这个上下文中

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);

我不确定为什么你的函数有 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是同一名称空间的一部分。

于 2012-02-04T15:32:03.207 回答