如果标题是:
,我有一个有朋友功能的课程 class A{
friend void foo();
public:
A(){}
};
void foo();
所以我不能得到的是编译器对第二个声明做了什么?
我已经注意到我可以按照我想要的方式编写尽可能多的内容,例如
void foo();
void foo();
...
(假设实现在cpp文件中)
另外,我无法找到标准所说的声明某些功能的朋友也声明了该功能本身。
答案 0 :(得分:2)
friend void foo();
这个declearation只是告诉编译器某个地方你有一个函数void foo()
,该函数将能够访问你班级的所有成员。
你写了多少次:
void foo();
void foo();
这不会起作用,因为这是foo()
未定义foo()
的原型。在某个地方你必须写一个foo()
的主体,否则对foo()
的任何调用都将失败
答案 1 :(得分:2)
如果friend
声明是 only 声明,则该函数将位于周围的命名空间中,但正常的查找规则无法找到;它只能通过参数依赖查找找到。
在这种情况下,这意味着它根本找不到,因为没有参数;因此,您还需要在命名空间中使用声明才能使其可访问。
有时你想要这种行为;例如,ADL可以找到流操作符,而无需在命名空间中声明它:
struct A {
friend std::ostream & operator<<(std::ostream & s, A const & a) {
return s << "Hello";
}
};
A a;
std::cout << a; // finds the friend function by ADL, based on the argument 'a'
我已经注意到我可以按照我想要的方式编写尽可能多的内容
是的,您可以根据需要多次重复声明。
另外,我无法找到标准所说的声明某些功能的朋友也声明了该功能本身。
声明的大多数规范(C ++ 11第7节)都是相同的,无论声明是否包含friend
说明符。 7.3.1.2/3指定名称在名称空间中,而不是类,并指定查找规则。