friend int pqr(abc);
声明没问题。它不起作用,因为abc
在您将其用作函数中的参数类型之前尚未定义类型pqr()
。在函数之前定义它:
#include<iostream>
// By the way, "using namespace std" can cause ambiguities.
// See http://www.parashift.com/c++-faq-lite/coding-standards.html#faq-27.5
using namespace std;
// Class defined outside the pqr() function.
class abc
{
int x;
public:
int xyz()
{
return x=4;
}
friend int pqr(abc);
};
// At this point, the compiler knows what abc is.
int pqr(abc t)
{
t.xyz();
return t.x;
}
int main()
{
abc t;
cout<<"Return "<<pqr(t)<<endl;
}
我知道您想使用本地课程,但是您设置的内容不起作用。局部类仅在定义它的函数内部可见。如果要使用函数abc
外部的实例,则pqr()
必须在函数外部定义abc
类。
但是,如果您知道abc
该类将仅在pqr()
函数内使用,则可以使用本地类。但在这种情况下,您确实需要friend
稍微修正一下声明。
#include<iostream>
// By the way, "using namespace std" can cause ambiguities.
// See http://www.parashift.com/c++-faq-lite/coding-standards.html#faq-27.5
using namespace std;
// pqr() function defined at global scope
int pqr()
{
// This class visible only within the pqr() function,
// because it is a local class.
class abc
{
int x;
public:
int xyz()
{
return x=4;
}
// Refer to the pqr() function defined at global scope
friend int ::pqr(); // <-- Note :: operator
} t;
t.xyz();
return t.x;
}
int main()
{
cout<<"Return "<<pqr()<<endl;
}
这在 Visual C++(编译器版本 15.00.30729.01)上编译时没有警告。