【问题标题】:C++ nested inheritance error "expected class-name before ‘{’ token"C ++嵌套继承错误“'{'标记之前的预期类名”
【发布时间】:2016-03-18 12:45:07
【问题描述】:

所以我在尝试编译我的项目时收到以下编译错误:

g++ -Wall -c --std=c++11 source.cpp token.cpp
g++ -Wall -c --std=c++11 pascalToken.cpp
pascalWordToken.hpp:7:1: error: expected class-name before ‘{’ token
g++ -Wall -c --std=c++11 pascalWordToken.cpp
pascalWordToken.hpp:7:1: error: expected class-name before ‘{’ token`

以下代码已被截断以保持帖子尽可能小,我希望所有相关部分都存在。

token.hpp 基类接口

#ifndef TOKEN_HPP
#define TOKEN_HPP

#include "source.hpp"

class Token {
public:
    Token(Source& source_ref);
    // public getter methods

protected:
    // protected member variables
    void extract();
    // more code ...
};

#endif // TOKEN_HPP

token.cpp 基类源码

#include "token.hpp"

Token::Token(Source& source_ref)
{
    // initialization of some member variables
    extract();
}

void Token::extract()
{
    // some code
}

pascalToken.hpp 文件

#ifndef PASCAL_TOKEN_HPP
#define PASCAL_TOKEN_HPP

#include "token.hpp"
#include "source.hpp"

class PascalToken : public Token
{
protected:
    PascalToken(Source& source_ref);
};

#endif // PASCAL_TOKEN_HPP

pascalToken.cpp 文件

#include "pascalToken.hpp"

PascalToken::PascalToken(Source& source_ref) : Token(source_ref) {}

pascalWordToken.hpp 文件

#ifndef PASCAL_WORD_TOKEN_HPP
#define PASCAL_WORD_TOKEN_HPP

#include "token.hpp"
#include "pascalToken.hpp"
#include "source.hpp"

class PascalWordToken : public PascalToken
{
public:
    PascalWordToken(Source& source_ref);

protected:
    void extract();
};

#endif // PASCAL_WORD_TOKEN_HPP`

pascalWordToken.cpp 文件

#include "pascalWordToken.hpp"
PascalWordToken::PascalWordToken(Source& source_ref) : PascalToken(source_ref)
{}

void PascalWordToken::extract()
{
    // code ...
}

编辑:

source.hpp 文件

#ifndef SOURCE_HPP
#define SOURCE_HPP

#include <fstream>

#ifndef EOF
#define EOF '\0'    // end-of-file
#endif
#define EOL '\n'    // end-of-line

class Source {
public:
    Source(std::ifstream& reader_ref);

    // some code ....

private:
    std::ifstream& m_reader_ref;
    // some private member variables/methods

protected:
    // some protected member variables
};

#endif // SOURCE_HPP

source.cpp 文件

#include "source.hpp"

#include <execinfo.h>
#include <unistd.h>

Source::Source(std::ifstream& reader_ref) : m_reader_ref(reader_ref) {}

请注意,代码已被严重截断,并且项目中还有更多文件,但它们都可以正常编译,并且在我包含 pascalWordToken 接口之前不会出现错误......

【问题讨论】:

  • 帖子的最后一行很明显。
  • 所有的反斜杠是怎么回事?
  • 当我编辑代码以获得更好的格式时,我不知道如何处理反斜杠,所以我离开了它们。如果它们不在实际代码中,那么您应该编辑您的问题以删除它们。同时请出示您的source.hpp 文件。
  • 确保source.hpp 不包括token.hpppascalWordToken.hpppascalToken.hpp
  • 那么你可能在你拥有的所有头文件的至少一个中的某个地方有一个循环依赖。这就是我个人避免在其他头文件中包含头文件的原因,除非绝对需要,而是尽可能使用前向声明

标签: c++ inheritance compiler-errors


【解决方案1】:

我假设您的 #include "pascalToken.hpp" 在 pascalWordToken.hpp 文件中不起作用。尝试用类 PascalToken 替换它;并将其包含在 cpp 文件中。

【讨论】:

  • 当我这样做时出现以下错误,pascalWordToken.hpp:8:32: error: invalid use of incomplete type ‘class PascalToken'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-22
  • 2015-01-19
相关资源
最近更新 更多