С декларацией 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 компилятора).