友元说明符在c++中的工作原理
How friend specifier does work in c++?
考虑以下代码:
#include <stdio.h>
class A
{
friend void foo(){ printf("%dn",_a); }
public:
A(int);
private:
static const int _a=5;
};
class B
{
friend void foo(){ printf("%dn",_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
我认为用友元说明符定义的函数是外部链接。那么为什么an_test.cpp:21:6: error: ' foo '没有在这个作用域中声明呢?
我发现了一些关于c++友函数的信息,可以帮助您了解错误发生的原因:
c++友元函数
注意:
类的友元函数定义在类的作用域之外,但是它有权访问所有私人和受保护的成员类。尽管好友功能的原型出现在类定义中,友元不是成员函数。朋友可以是函数、函数模板、成员函数或一个或多个类模板,在这种情况下,整个类及其所有成员都是朋友。
我想你把链接与作用域混淆了。在您的代码中,两个foo()
定义的作用域都在它们各自的类中,因此main()
无法看到它们的定义。
如果你想让foo()
在main()
中可见,你需要将它的声明移到外面,并在类中做一个friend
声明。
#include <stdio.h>
class A
{
friend void foo(A a);
public:
A(int) {}
private:
static const int _a=5;
};
void foo(A a){ printf("%dn",a._a); }
int main()
{
foo(A(5));
}
下面也可以,定义在里面,声明在外面。
#include <stdio.h>
class A
{
friend void foo(A a){ printf("%dn",a._a); }
public:
A(int) {}
private:
static const int _a=5;
};
void foo(A a);
int main()
{
foo(A(5));
}
我想这个关于朋友范围的链接可以回答你的问题
c++中的友元作用域
"Foo是A的朋友"并不意味着"Foo"是"An_test"的朋友
相关文章:
- 激励'inline'说明符的真实世界示例?
- QSqlquery prepare()和bindvalue()不工作
- 导入库可以跨dll版本工作吗
- 缺少类型说明符,显式类型为"缺少错误"
- 以螺旋方式打印矩阵的程序.(工作不好)
- 对象指针在c++中是如何工作的
- 为什么在Windows上的VS 2019和Clang 9中"size_t"在没有标题的情况下工作
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- 为字符串中每 N 个字符插入空格的函数没有按照我认为的方式工作?
- C++为线程工作动态地分割例程
- 为什么我的 std::ref 无法按预期工作?
- 布尔比较运算符是如何在C++中工作的
- SampleConsensusPrerejective(ext.RANSAC)是如何真正工作的
- 不确定要在我的main中放入什么才能使我的代码正常工作
- 为什么std::condition_variable notify_all的工作速度比notify_one快(对于随机请
- <<操作员在下面的行中工作
- 访问说明符(私有/公共/受保护)如何在内部工作(限制成员访问)?
- c++格式说明符不工作
- 友元说明符在c++中的工作原理
- C++17异常说明符类型系统将如何工作