首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >友元说明符在c++中是如何工作的?

友元说明符在c++中是如何工作的?
EN

Stack Overflow用户
提问于 2014-05-13 12:18:15
回答 3查看 145关注 0票数 1

考虑以下代码:

代码语言:javascript
复制
#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();
}

编译后,我有以下错误:

代码语言:javascript
复制
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

我认为用友元说明符定义的函数是外部链接。那么为什么没有在这个作用域中声明an_test.cpp:21:6: error:‘foo’呢?

EN

回答 3

Stack Overflow用户

发布于 2014-05-13 12:23:24

我认为你混淆了链接和作用域。在您的代码中,两个定义的foo()作用域都在各自的类中,因此main()看不到它们的定义。

如果您希望foo()main()中可见,则需要将其声明移到外部,并在类内部进行friend声明。

代码语言:javascript
复制
#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));
}

下面的代码也可以,其中定义在内部,外部有一个声明。

代码语言:javascript
复制
#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
EN

Stack Overflow用户

发布于 2014-05-13 12:36:02

我发现了一些关于C++好友函数的信息,它们可能会帮助您了解错误发生的原因:

C++ Friend Functions

请注意:

类的友元函数在该类的作用域之外定义,但它有权访问该类的所有私有和受保护的成员。即使友元函数的原型出现在类定义中,友元函数也不是成员函数。朋友可以是函数、函数模板或成员函数,也可以是类或类模板,在这种情况下,整个类及其所有成员都是朋友。

票数 1
EN

Stack Overflow用户

发布于 2014-05-13 15:43:44

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

Friend scope in C++

"Foo are friend of A“并不意味着"Foo”是"An_test“的朋友。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/23622718

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档