編譯器無法識別C++中的類

具有這個基類:

Core.hpp:

#ifndef C3_CORE_HPP
#define C3_CORE_HPP

#include <c3/utils/Str.hpp>
#include <c3/utils/Vec.hpp>
#include <c3/school/Student.hpp>

class Core {
public:
    Core() = default;
    explicit Core(std::istream&in);
    virtual ~Core();

    virtual double grade() const;

    const Str &getName() const;
    double getMidterm() const;
    double getFinal() const;
    const Vec<double> &getHomeworks() const;

protected:
    Vec<double> homeworks;

    virtual std::istream &read(std::istream &in);
    virtual Core *clone() const;

    std::istream &read_common(std::istream &in);

private:
    Str name;
    double midterm{}, final{};

    friend class Student;
};

std::istream &read_hw(std::istream &in, Vec<double> &hws);

#endif //C3_CORE_HP

and Grad.hpp:

#ifndef C3_GRAD_HPP
#define C3_GRAD_HPP

#include <c3/school/Core.hpp>

class Grad: public Core {
public:
    Grad() = default;
    explicit Grad(std::istream &in);

    std::istream &read(std::istream &in) override;
    double grade() const override;

protected:
    Grad *clone() const override;

private:
    double thesis{};
};


#endif //C3_GRAD_HPP

(代碼是根據安德魯·克尼格的加速書C++生成的)

現在,我得到了一個錯誤:

In file included from /home/shepherd/Desktop/cpp/cpp0book/c3/./c3/school/Student.hpp:8,
                 from /home/shepherd/Desktop/cpp/cpp0book/c3/./c3/school/Core.hpp:10,
                 from /home/shepherd/Desktop/cpp/cpp0book/c3/c3/main.cpp:4:
/home/shepherd/Desktop/cpp/cpp0book/c3/./c3/school/Grad.hpp:10:25: error: expected class-name before ‘{’ token
   10 | class Grad: public Core {
      |                         ^
/home/shepherd/Desktop/cpp/cpp0book/c3/./c3/school/Grad.hpp:15:19: error: ‘std::istream& Grad::read(std::istream&)’ marked ‘override’, but does not override
   15 |     std::istream &read(std::istream &in) override;
      |                   ^~~~
/home/shepherd/Desktop/cpp/cpp0book/c3/./c3/school/Grad.hpp:16:12: error: ‘double Grad::grade() const’ marked ‘override’, but does not override
   16 |     double grade() const override;
      |            ^~~~~
/home/shepherd/Desktop/cpp/cpp0book/c3/./c3/school/Grad.hpp:19:11: error: ‘Grad* Grad::clone() const’ marked ‘override’, but does not override
   19 |     Grad *clone() const override;
      |           ^~~~~
In file included from /home/shepherd/Desktop/cpp/cpp0book/c3/./c3/school/Core.hpp:10,
                 from /home/shepherd/Desktop/cpp/cpp0book/c3/c3/main.cpp:4:
/home/shepherd/Desktop/cpp/cpp0book/c3/./c3/school/Student.hpp:26:5: error: ‘Core’ does not name a type
   26 |     Core *cp{};
      |     ^~~~
gmake[2]: *** [CMakeFiles/c3.dir/build.make:76: CMakeFiles/c3.dir/c3/main.cpp.o] Error 1
gmake[1]: *** [CMakeFiles/Makefile2:83: CMakeFiles/c3.dir/all] Error 2
gmake: *** [Makefile:91: all] Error 2

第一個錯誤是

error: expected class-name before ‘{’ token
   10 | class Grad: public Core {

在我看來,即使包含Core類,編譯器也無法識別它。那么為什么編譯器不能識別我的基類呢?

使用此目錄結構:http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2018/p1204r0.html

github repo:https://github.com/Herdsmann/student_project.git

? 最佳回答:

正如我在評論中所說的,問題是由于循環依賴。特別是你的

Student.hpp包括-->Grad.hpp,后者又包括-->Core.hpp,后者最后包括-->Student.hpp

從上面可以看到,您最終到達了起點,即Student.cpp。這就是為什么它被稱為循環依賴。

要解決這個問題,只需從Core.hpp中刪除#include <c3/school/Student.hpp>。這是因為對于友元聲明friend class Student,您不需要向前聲明或包含Student類。

因此,修改/更正的Core.hpp文件如下所示:

#ifndef C3_CORE_HPP
#define C3_CORE_HPP

#include <c3/utils/Str.hpp>
#include <c3/utils/Vec.hpp>
//note i have removed the include header from here

class Core {
  //other members here as before

private:
    Str name;
    double midterm{}, final{};

    friend class Student;//THIS WORKS WITHOUT INCLUDING Student.hpp
};

std::istream &read_hw(std::istream &in, Vec<double> &hws);

#endif //C3_CORE_HPP
主站蜘蛛池模板: 国产日韩精品一区二区三区| 亚洲av无码一区二区三区天堂| 精品人伦一区二区三区潘金莲| 无码中文字幕人妻在线一区二区三区| 视频精品一区二区三区| 亚洲一区免费视频| 一区二区三区福利视频| 欧美亚洲精品一区二区| 国产一区二区在线观看app| 亚洲国产激情在线一区| 精品一区二区三区四区| 国产情侣一区二区三区| 亚洲乱码国产一区网址| 高清一区二区三区视频| 美女免费视频一区二区三区| 国产精品日韩欧美一区二区三区| 精品一区二区三区四区在线播放| 久久久91精品国产一区二区三区| 亚洲中文字幕丝袜制服一区 | 精品福利一区二区三| 一本色道久久综合一区| 麻豆一区二区三区蜜桃免费| 国产伦精品一区二区三区四区| 国产精品无码亚洲一区二区三区| 冲田杏梨AV一区二区三区| 无码国产精品久久一区免费| 怡红院美国分院一区二区| 日本免费电影一区二区 | 精品女同一区二区三区免费播放| 一区二区3区免费视频| 日韩美女在线观看一区| 久热国产精品视频一区二区三区 | 无码人妻AV免费一区二区三区| 国产一区在线视频| 一区二区三区国产| 免费一区二区无码东京热| 午夜福利一区二区三区高清视频| 91在线视频一区| 精品无码国产AV一区二区三区| 日本一区二区三区四区视频| 一区二区在线播放视频|