Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/search/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 带友元函数的转发声明:不完整类型的使用无效 #包括 乙级;; 甲级{ INTA; 公众: 朋友void B::frndA(); }; B类{ int b; 公众: 无效frndA(); }; void B::frndA(){ obj; std::cout_C++_Forward Declaration_Friend Function - Fatal编程技术网

C++ 带友元函数的转发声明:不完整类型的使用无效 #包括 乙级;; 甲级{ INTA; 公众: 朋友void B::frndA(); }; B类{ int b; 公众: 无效frndA(); }; void B::frndA(){ obj; std::cout

C++ 带友元函数的转发声明:不完整类型的使用无效 #包括 乙级;; 甲级{ INTA; 公众: 朋友void B::frndA(); }; B类{ int b; 公众: 无效frndA(); }; void B::frndA(){ obj; std::cout,c++,forward-declaration,friend-function,C++,Forward Declaration,Friend Function,将整个class B…声明放在class A之前。您尚未声明B::frndA(); #include <iostream> class B; class A{ int a; public: friend void B::frndA(); }; class B{ int b; public: void frndA(); }; void B::frndA(){ A obj; std::cout << "A.a = " << obj.a <

将整个
class B…
声明放在
class A
之前。您尚未声明
B::frndA();

#include <iostream>

class B;

class A{
 int a;
public:
 friend void B::frndA();
};

class B{
 int b;
public:
 void frndA();
};

void B::frndA(){
 A obj;
 std::cout << "A.a = " << obj.a << std::endl;
}

int main() {
 return 0;
}
#包括
使用名称空间std;
B类{
int b;
公众:
无效frndA();
};
甲级{
INTA;
公众:
朋友void B::frndA();
};
void B::frndA(){
obj;

//cout您需要将
B
的声明放在
A
之前。编译器不知道这一点:
B::frndA()
。前向声明不足以推断类型的成员

我建议将您的类
A
声明放在文件
A.h
中,它的定义放在文件
A.cpp
中。同样,对于
B.h
B.cpp
中的类型
B
也是如此

在每个头文件的顶部放置一次
#pragma
(或者如果您希望包含卫士)


然后在
B.h
中,您可以简单地包含
A.h

问题是,在编译器看到声明之前,您不能与成员函数交朋友


您需要重新排列代码以解决问题(即将
B类
的定义移到
A类
之前).

我已经重新标记了这个问题。
friend
不是最有用的关键字之一。另外,
转发声明
组合在一个标记中更有意义。编辑:哦和
也比
函数
我想:)事实上,当同一个文件位于不同的搜索路径中时,pragma一次可能会失败因为它基于路径而不是文件的内容。所有主要编译器都支持pragma once。我不认为#pragma once可以被否决。请参见此处:
#include <iostream>
using namespace std;

class B{
    int b;
public:
    void frndA();
};

class A{
    int a;
public:
    friend void B::frndA();
};



void B::frndA(){
    A obj;
    //cout<<"A.a = "<<obj.a<<endl;
}

int main() {
    return 0;
}