请考虑以下代码:
#include <stdio.h>
class A
{
friend void foo(){ printf("%d\n",_a); }
public:
A(int);
private:
static const int _a=5;
};
class B
{
friend void foo(){ printf("%d\n",_a); }
private:
static const int _a=6;
};
int main()
{
foo();
}
编译完成后,我发现了以下错误:
an_test.cpp:14:14: error: redefinition of ‘void foo()’
an_test.cpp:5:14: error: ‘void foo()’ previously defined here
an_test.cpp: In function ‘int main()’:
an_test.cpp:21:6: error: ‘foo’ was not declared in this scope
make: *** [an_test.o] Error 1
我认为用friend说明符定义的函数是外部链接。那么为什么an_test.cpp:21:6:错误:'foo'未在此范围内声明?
答案 0 :(得分:1)
我认为你将链接与范围界定混淆。在您的代码中,foo()
个定义的范围都在各自的类中,因此main()
无法看到它们的定义。
如果您希望在foo()
中显示main()
,则需要将其声明移到外面,并在课程中发出friend
声明。< / p>
#include <stdio.h>
class A
{
friend void foo(A a);
public:
A(int) {}
private:
static const int _a=5;
};
void foo(A a){ printf("%d\n",a._a); }
int main()
{
foo(A(5));
}
以下内容也适用,其中定义在内部并且在外面有声明。
#include <stdio.h>
class A
{
friend void foo(A a){ printf("%d\n",a._a); }
public:
A(int) {}
private:
static const int _a=5;
};
void foo(A a);
int main()
{
foo(A(5));
}
答案 1 :(得分:1)
我发现了一些关于C ++ Friend函数的内容,可以帮助您了解错误发生的原因:
请注意:
班级的朋友功能是在班级之外定义的。范围但是 它有权访问所有私人和受保护的成员 类。即使朋友功能的原型出现在 类定义,朋友不是成员函数。朋友可以是一个 函数,函数模板或成员函数,或类或类 模板,在这种情况下,整个类及其所有成员都是 朋友。
答案 2 :(得分:0)
我认为这个关于朋友范围的链接可以回答你的问题
&#34; Foo是A&#34;的朋友。并不意味着&#34; Foo&#34;是&#34; An_test&#34;
的朋友