[英]Why C++ friendship for function inside a class does not work same as a standalone function?
我想知道为什么以下两个代码之一编译而另一个不编译。 在第一个代码中,createB 是一个独立的 function。 在第二个代码中,function createB 是 class A 的成员。
第一个编译。
#include <iostream>
class A;
class B {
public:
B() { std::cout << "B"; }
friend B createB();
};
class A {
public:
A() { std::cout << "A"; }
};
B createB() { return B(); }
int main() {
A a;
B b = createB();
}
第二个没有。
#include <iostream>
class A;
class B {
public:
B() { std::cout << "B"; }
friend B A::createB();
};
class A {
public:
A() { std::cout << "A"; }
B createB() { return B(); }
};
int main() {
A a;
B b = a.createB();
}
在第一个片段中, createB
是一个免费的(独立的)function,并且友元声明不一定要命名一个现有的 function。 所以这可行,并且还隐式声明了一个名为createB
的 function,其返回类型为B
在全局命名空间中,尽管此createB
通过普通查找是不可见的。
第二个示例中的问题是A
在朋友声明的点是不完整的, friend BA::createB();
.
为了解决这个问题,我们可以将A
的定义移到B
之前,这样A
在友元声明处是完整的。 此外,我们可以在定义B
之后提供createB
的定义,如下所示:
//forward declaration so that B can be used in declaration B createB();
class B;
class A {
public:
A() { std::cout << "A"; }
//this is declaration
B createB();
};
class B {
public:
B() { std::cout << "B"; }
friend B A::createB(); //this works as now at this point A is complete since we moved the definition of A to before B
};
//this is definition
B A::createB() { return B(); }
int main() {
A a;
B b = a.createB();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.