class Example{
public:
friend void Clone::f(Example);
Example(){
x = 10;
}
private:
int x;
};
class Clone{
public:
void f(Example ex){
std::cout << ex.x;
}
};
当我将f作为普通函数写入时,程序编译成功。但是,当我将f作为类成员编写时,会发生此错误。
屏幕截图:
答案 0 :(得分:3)
您看到的错误不是根本原因编译错误。这是一个不同问题的神器。你正在与一个类的成员函数建立联系,编译器甚至不存在任何地球线索,更不用说该特定成员了。
非成员函数的friend
声明具有以下优点:它还充当原型声明。对于成员函数来说,不就是这种情况。编译器必须知道(a)类存在,(b)成员存在。
编译原始代码(我使用clang ++ v3.6),以下错误实际报告:
main.cpp:6:17: Use of undeclared identifier 'Clone'
main.cpp:17:25: 'x' is a private member of 'Example'
前者是后者的直接原因。但是改为这个:
#include <iostream>
#include <string>
class Example;
class Clone
{
public:
void f(Example);
};
class Example
{
public:
friend void Clone::f(Example);
Example()
{
x = 10;
}
private:
int x;
};
void Clone::f(Example ex)
{
std::cout << ex.x;
};
int main()
{
Clone c;
Example e;
c.f(e);
}
<强>输出强>
10
执行以下操作:
Example
Clone
,但未实施Clone::f
(尚未)Example
,从而使编译器知道x
。
Clone::f
至Example
Clone::f
在每个阶段,我们都会提供编译器需要继续的内容。
祝你好运。