朋友说明符如何在c ++中工作?

时间:2014-05-13 04:18:15

标签: c++ friend

请考虑以下代码:

#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'未在此范围内声明?

3 个答案:

答案 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函数的内容,可以帮助您了解错误发生的原因:

C++ Friend Functions

请注意:

  

班级的朋友功能是在班级之外定义的。范围但是   它有权访问所有私人和受保护的成员   类。即使朋友功能的原型出现在   类定义,朋友不是成员函数。朋友可以是一个   函数,函数模板或成员函数,或类或类   模板,在这种情况下,整个类及其所有成员都是   朋友。

答案 2 :(得分:0)

我认为这个关于朋友范围的链接可以回答你的问题

Friend scope in C++

&#34; Foo是A&#34;的朋友。并不意味着&#34; Foo&#34;是&#34; An_test&#34;

的朋友