我在命名空间内创建了一个类,现在当我必须使用或调用命名空间时会出现问题,编译错误的可能原因是什么?
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:错误:在此上下文中
答案 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
属于同一命名空间。