好吧,我宣布了一个朋友函数:
// user-proc.h
class cregister{
private:
levy user; // typedef struct
int testp;
public:
friend void test();
cregister(levy &tmp);
levy getUser();
void displayUser(levy &);
};
然后我将其定义为:
// user-proc.cpp
void test()
{
cout << "test" << endl;
}
我试图调用main函数但是它给了我在这个范围内没有声明它。我做了一些研究,但我发现,他们说朋友类型不完全是声明你必须在课外定义它。我试过它然后通常错误消失但是因为它发生了朋友的功能无法访问私人成员。
编辑:我使用了void test();在类定义之前和使用对象访问私有成员。它就这样固定了。
答案 0 :(得分:2)
你需要有两个声明:一个普通的函数原型声明,另一个在类中作为朋友声明。
// user-proc.h
void test(); // Added prototype
class cregister{
private:
levy user; // typedef struct
int testp;
public:
friend void test(); // Friend declaration still here
cregister(levy &tmp);
levy getUser();
void displayUser(levy &);
};
答案 1 :(得分:0)
看起来这里声明了两个test()
函数;一个在类中,一个(在定义中)在cpp文件中。
仅在类中声明的test()
实际上只能通过ADL 访问,这不会在这里工作,因为它不需要类的类型参数。
在课程定义之前添加void test();
声明应该使test
函数中的课程内部可用。
// user-proc.h
void test();
class cregister{
// redacted...
public:
friend void test();
};
虽然test()
可以访问此处的私有成员,但除非它声明要使用的类(有效对象)的实例,否则该函数不太有用。 考虑为函数添加一个参数,例如void test(cregister& arg);
(此处ADL会启动)。我推断这里的功能是专门用于测试的,所以上面的内容可能不适用,但在一般情况下它可能有用。