为什么在编译过程中会收到语法错误?

骗子

有人可以解释为什么我收到语法错误:在构建过程中没有class Bar;foo.hpp头文件中包含标识符“ Bar”吗?

在构建之前,我在Visual Studio 2019中没有收到任何错误,并且构建顺序似乎是bar,然后foo,然后main,因此在执行这些#include语句之后似乎在构建过程中bar头文件首先包含在头文件中foo

我在下面包含了概述基本问题的代码。

//Foo header file
#pragma once

#include "bar.hpp"  
#include <iostream>

class Bar; //Commenting this line out results in no longer being able to build the project

class Foo {

public:
    Foo();

    void pickSomething(Bar& bar);
};

//Foo cpp file
#include "foo.hpp"

Foo::Foo() {
    std::cout << "Made Foo" << std::endl;
}

void Foo::pickSomething(Bar& bar) {
    bar.getSomething();
    std::cout << "Picked something!" << std::endl;
}

//Bar header file
#pragma once

#include "foo.hpp"
#include <iostream>

class Foo;

class Bar {

public:
    Bar(Foo& foo);

    void getSomething();
};

//Bar cpp file
#include "bar.hpp"

Bar::Bar(Foo& foo) {
    std::cout << "Made bar" << std::endl;
}

void Bar::getSomething() {
    std::cout << "Gave something!" << std::endl;
}

//main file
#include "foo.hpp"
#include "bar.hpp"

int main() {
    Foo foo;
    Bar bar(foo);
    foo.pickSomething(bar);

    return 0;
}
苏木渡

概要:

  • foo.hpp包括bar.hppbar.hpp包括foo.hpp这是一个循环依赖性。
  • #pragma once 请确保不再加载相同的标头(如果已加载)。

  • 仅编译bar.cpp失败(foo.cpp并且main.cpp将成功编译)

让我们在编译时跟随预处理器bar.cpp事情按以下顺序发生。

  1. bar.cpp 包括 bar.hpp
  2. bar.hpp包括foo.hpp(注意以下两点)
    • 预处理器会记住它已输入,bar.hpp并且将避免在当前循环中再次输入它。
    • 该符号Bar(class的声明Bar)仍未像foo.hpp之前那样加载
  3. foo.hpp 尝试包括 bar.hpp
    • 预处理器知道它已经输入bar.hpp,因此将被忽略!
    • 但是,Foo类声明使用名为的符号Bar但这是之前没有声明的!

未知符号Bar可能代表了很多东西(一个类,一个宏等)。因此,编译器(正确地)失败了,因为它不知道如何处理它。

解决方案是前向声明。在那里,您可以保证编译器该符号Bar表示一个类。只要您没有在编译器需要了解类布局的地方做任何事情(例如,定义类型的成员函数Bar,访问类的成员Bar等),编译就会成功。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么在此过程中出现语法错误

来自分类Dev

为什么我会收到ELIF无效的语法错误?

来自分类Dev

我应该使用哪个控制原语来避免在编译过程中出现语法错误?

来自分类Dev

为什么在编译过程中这个特殊的代码的.class错误?

来自分类Dev

为什么MPI_REDUCE在编译时返回语法错误?

来自分类Dev

为什么在这种野牛语法中会收到这么多“无用的规则/令牌”警告?

来自分类Dev

通过电子邮件地址选择时,为什么会收到MySQL语法错误(1604)?

来自分类Dev

为什么我会收到此语法错误:关键字不能是表达式

来自分类Dev

每当我尝试编译javascript代码时,我都会收到语法错误

来自分类Dev

过程中的SQL语法错误

来自分类Dev

存储过程中的语法错误

来自分类Dev

在编译时抑制语法错误

来自分类Dev

为什么我在编译时收到以下错误:

来自分类Dev

为什么我在python中收到SQL语法错误

来自分类Dev

为什么我收到无效的语法错误?

来自分类Dev

为什么我在PHP中收到语法错误?

来自分类Dev

为什么我收到无效的语法错误?

来自分类Dev

为什么将参数传递到存储过程中会导致MySQL错误1267?

来自分类Dev

为什么nvcc在编译过程中删除我的if分支?

来自分类Dev

为什么Android Studio允许我编译语法错误

来自分类Dev

为什么在推动过程中会产生新的头像?

来自分类Dev

它的地址在执行过程中会更改。为什么?

来自分类Dev

为什么会收到这些错误消息?

来自分类Dev

代码在编译过程中出现错误,请解释

来自分类Dev

存储过程中的MySQL语法错误

来自分类Dev

创建过程中的mysql语法错误1064

来自分类Dev

.SQLiteException:在“,”附近:语法错误(代码1):,在编译时:

来自分类Dev

Android SQLiteException:靠近“,”:语法错误:,在编译INSERT时

来自分类Dev

语法错误(代码1):,而在编译时:

Related 相关文章

  1. 1

    为什么在此过程中出现语法错误

  2. 2

    为什么我会收到ELIF无效的语法错误?

  3. 3

    我应该使用哪个控制原语来避免在编译过程中出现语法错误?

  4. 4

    为什么在编译过程中这个特殊的代码的.class错误?

  5. 5

    为什么MPI_REDUCE在编译时返回语法错误?

  6. 6

    为什么在这种野牛语法中会收到这么多“无用的规则/令牌”警告?

  7. 7

    通过电子邮件地址选择时,为什么会收到MySQL语法错误(1604)?

  8. 8

    为什么我会收到此语法错误:关键字不能是表达式

  9. 9

    每当我尝试编译javascript代码时,我都会收到语法错误

  10. 10

    过程中的SQL语法错误

  11. 11

    存储过程中的语法错误

  12. 12

    在编译时抑制语法错误

  13. 13

    为什么我在编译时收到以下错误:

  14. 14

    为什么我在python中收到SQL语法错误

  15. 15

    为什么我收到无效的语法错误?

  16. 16

    为什么我在PHP中收到语法错误?

  17. 17

    为什么我收到无效的语法错误?

  18. 18

    为什么将参数传递到存储过程中会导致MySQL错误1267?

  19. 19

    为什么nvcc在编译过程中删除我的if分支?

  20. 20

    为什么Android Studio允许我编译语法错误

  21. 21

    为什么在推动过程中会产生新的头像?

  22. 22

    它的地址在执行过程中会更改。为什么?

  23. 23

    为什么会收到这些错误消息?

  24. 24

    代码在编译过程中出现错误,请解释

  25. 25

    存储过程中的MySQL语法错误

  26. 26

    创建过程中的mysql语法错误1064

  27. 27

    .SQLiteException:在“,”附近:语法错误(代码1):,在编译时:

  28. 28

    Android SQLiteException:靠近“,”:语法错误:,在编译INSERT时

  29. 29

    语法错误(代码1):,而在编译时:

热门标签

归档